Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 21

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ выдСлСния ΠΈ освобоТдСния памяти ΠΈ подсчСта ссылок ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π΅Π½ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° трСбуСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ Π²ΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с указатСлями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ памяти Π½Π΅ запутался.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ string, Ρ‚ΠΈΠΏ WideString Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ счСтчика ссылок, ΠΈ любоС присваиваниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… этого Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ строки. Π­Ρ‚ΠΎ сдСлано Π² цСлях совмСстимости с систСмным Ρ‚ΠΈΠΏΠΎΠΌ BSTR, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌΡΡ Π² COM/DCOM ΠΈ OLE. 

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Windows API Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΈΠΏ string. Они Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ со строками, ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ Π½Π° #0 (Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ строки, null-terminated strings). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ строкой называСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ символов. ΠŸΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ ΠΊΠΎΠ½Ρ†Π° Ρ‚Π°ΠΊΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ являСтся символ с ΠΊΠΎΠ΄ΠΎΠΌ 0. РаньшС для Ρ‚Π°ΠΊΠΈΡ… строк сущСствовал Ρ‚Π΅Ρ€ΠΌΠΈΠ½ ASCIIZ. ASCII β€” Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ, Z β€” zero. БСйчас ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° ASCII Π² чистом Π²ΠΈΠ΄Π΅ Π½Π΅ встрСчаСтся, поэтому этот Ρ‚Π΅Ρ€ΠΌΠΈΠ½ большС Π½Π΅ примСняСтся, хотя это Ρ‚Π΅ ΠΆΠ΅ самыС ΠΏΠΎ своСй сути строки. Как ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ, Π² Delphi ΠΊΠΎ всСм строкам Ρ‚ΠΈΠΏΠ° string нСявно добавляСтся Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ, Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΏΡ€ΠΈ подсчСтС числа символов. Π­Ρ‚ΠΎ сдСлано для совмСстимости с Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ строками. Однако эта ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π°.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ строками Π² Delphi ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ слуТит Ρ‚ΠΈΠΏ PChar. Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ΄ΠΈΠ½ символ Ρ‚ΠΈΠΏΠ° Char, Π½ΠΎ подразумСваСтся, Ρ‡Ρ‚ΠΎ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ строки, ΠΈ Π·Π° Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ символы. Π“Π΄Π΅ Π±ΡƒΠ΄ΡƒΡ‚ эти символы Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ ΠΈ ΠΊΠ°ΠΊΠΈΠΌΠΈ срСдствами для Π½ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ, программист Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Он ΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ символов стоял #0.

Π‘Ρ‚Ρ€ΠΎΠΊΡƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ PChar, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ трСбуСтся string β€” компилятор сам Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ прСобразования. ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ Π½Π΅Π²Π΅Ρ€Π½ΠΎ. ЀактичСски, string β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ строки, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΉΡΡ Π½ΡƒΠ»Π΅ΠΌ, Ρ‚.Π΅. Ρ‚ΠΎΡ‚ самый ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ трСбуСтся ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с PChar. Однако, ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ, Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ манипуляции с этим ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ эффСктам, поэтому компилятор Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ явного привСдСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° string ΠΊ PChar. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, программист Π΄ΠΎΠ»ΠΆΠ΅Π½ ясно ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ, ΠΊ ΠΊΠ°ΠΊΠΈΠΌ послСдствиям это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти.

Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ описаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ API, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… строковыС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π² справкС, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях строковыС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ LPCTSTR (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetWindowText), Π° Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… β€” LPTSTR (GetWindowText). Π Π°Π½Π΅Π΅ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ появлСниС прСфикса C послС LP ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° константу, Ρ‚.Π΅. Ρ‚ΠΎ, Π½Π° Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ. Π’ΠΈΠΏ LPCTSTR ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π΅ строковыС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, содСрТимоС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… функция Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚, Π½ΠΎ Π½Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚. Π‘ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅ всСго. Рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetWindowText, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (листинг 1.20).

Листинг 1.20. Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ‚ΠΈΠΏΠ° LPCTSTR

{ Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 1 }

SetWindowText(Handle, 'Π‘Ρ‚Ρ€ΠΎΠΊΠ°');


{ Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 2

 S -пСрСмСнная Ρ‚ΠΈΠΏΠ° string }

SetWindowText(PChar(S));


{ Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ 3

 X - пСрСмСнная Ρ‚ΠΈΠΏΠ° Integer }

 SetWindowText(PChar('Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ' + IntToStr(X) + '%'));

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ компилятор Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π» Π² сСгмСнтС ΠΊΠΎΠ΄Π°, Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° эту ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция Π½Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ строку, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ‚Π°ΠΊΠΎΠ³ΠΎ указатСля Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрСдаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, хранящийся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ S. Π’Π°ΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ string ΠΊ PChar бСзопасно, Ρ‚.ΠΊ. строка, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ссылаСтся пСрСмСнная S, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Но здСсь сущСствуСт ΠΎΠ΄Π½Π° Ρ‚ΠΎΠ½ΠΊΠΎΡΡ‚ΡŒ: конструкция PChar(S) β€” это Π½Π΅ просто ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΈ Π΅Π΅ использовании нСявно вызываСтся функция _LStrToPChar. Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, ΠΊΠΎΠ³Π΄Π° string Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΏΡƒΡΡ‚ΡƒΡŽ строку, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ просто ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nil. Ѐункция _LStrToPChar провСряСт, пустая Π»ΠΈ строка хранится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈ, Ссли Π½Π΅ пустая, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π° Ссли пустая, Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅ nil, Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° символ #0, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для этого Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π² сСгмСнтС ΠΊΠΎΠ΄Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°ΠΆΠ΅ Ссли содСрТит ΠΏΡƒΡΡ‚ΡƒΡŽ строку, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ.

ВычислСниС строковых Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ пСрСраспрСдСлСния памяти, Π° это компилятор Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с выраТСниями Ρ‚ΠΈΠΏΠ° string. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТСния, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅, Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ string. Но Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ привСсти ΠΊ PChar. ΠŸΠ°ΠΌΡΡ‚ΡŒ для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° выраТСния выдСляСтся динамичСски, ΠΊΠ°ΠΊ ΠΈ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° string. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, слСдуСт привСсти Π΅Π³ΠΎ ΠΊ PChar. Π’ эпилог ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SetWindowText ΠΈΠ»ΠΈ ΠΈΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, добавляСтся ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ освобоТдаСт динамичСски ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку, поэтому ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти Π½Π΅ происходит. РазумССтся, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ способы формирования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° LPCTSTR, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… здСсь. МоТно, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ строки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ StrNew ΠΈΠ»ΠΈ родствСнной Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· модуля SysUtils. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ массив Ρ‚ΠΈΠΏΠ° Char. МоТно Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ способами. Но ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ здСсь Ρ‚Ρ€ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° LPTSTR ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° функция ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ чисто Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅, Ρ‚.Π΅. функция Π½Π΅ интСрСсуСтся, ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π» ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° значСния. ΠŸΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ строкового значСния всСгда Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Π³Π΄Π΅, ΠΊΠ΅ΠΌ ΠΈ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ записана строка? Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Windows API, Π·Π° ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅Π΄ΠΊΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ€Π΅ΡˆΠ°ΡŽΡ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: ΠΏΠ°ΠΌΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ пСрСдаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° этот Π·Π°Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ. Π‘Π°ΠΌΠ° функция Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ строку Π² этот Π±Π»ΠΎΠΊ.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ встаСт Π·Π°Π΄Π°Ρ‡Π° ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ объСм памяти слСдуСт Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡƒΡŽ строку. Π—Π΄Π΅ΡΡŒ API Π½Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. НапримСр, ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΎΠΊΠ½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GetWindowText Ρ€Π°Π·ΠΌΠ΅Ρ€ этого Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π²Ρ‹Π·Π²Π°Π² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ GetWindowTextLength. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° GetCurrentDirectory Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π΄Π»ΠΈΠ½Ρƒ строки. Если ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ памяти Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ нСдостаточно, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π΅Ρ‰Π΅ Ρ€Π°Π·. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΈΠΏΠ° SHGetSpecialFolderPath, Π² описании ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… написано, ΠΊΠ°ΠΊΠΎΠ² ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎΠ»Π½ΠΎΠΉ строки этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ (это, разумССтся, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΉ строки ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ СстСствСнноС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅). Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΡ… строки, Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ большС Π±Π°ΠΉΡ‚ΠΎΠ², Ρ‡Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ.

Π’Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ для получСния строки ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ способами. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ всСго статичСскиС массивы, Ρ‚ΠΈΠΏ string ΠΈΠ»ΠΈ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… строк.

БтатичСскиС массивы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ссли Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° извСстСн Π½Π° этапС компиляции. ΠœΠ°ΡΡΠΈΠ²Ρ‹ Ρ‚ΠΈΠΏΠ° Char с Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ индСксом 0 Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ компилятором ΠΊΠ°ΠΊ Π½ΡƒΠ»ΡŒ-Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ строки, поэтому с Π½ΠΈΠΌΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ дальнСйшиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎΡ‚ способ ΡƒΠ΄ΠΎΠ±Π΅Π½ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΈ освобоТдСнии памяти, поэтому ΠΎΠ½ часто примСняСтся Ρ‚Π°ΠΌ, Π³Π΄Π΅ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π΄Π»ΠΈΠ½Π° строки Π½Π° этапС нСизвСстна, Π½ΠΎ "исходя ΠΈΠ· Π·Π΄Ρ€Π°Π²ΠΎΠ³ΠΎ смысла" ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Π² ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв эта Π΄Π»ΠΈΠ½Π° Π½Π΅ прСвысит Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, которая ΠΈ бСрСтся Π² качСствС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Ρ‚ΠΈΠΏΠ° string Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ для получСния строковых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ систСмы. Для этого Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ строки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SetLength, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ строки Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ API. Π—Π΄Π΅ΡΡŒ слСдуСт ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: Ссли Π΄Π»ΠΈΠ½Π° строки окаТСтся Ρ€Π°Π²Π½ΠΎΠΉ Π½ΡƒΠ»ΡŽ, пСрСмСнная Ρ‚ΠΈΠΏΠ° string Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nil, Π° систСма попытаСтся Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎ этому ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ ΠΏΡƒΡΡ‚ΡƒΡŽ строку, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· СдинствСнного символа #0. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС Access violation.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ способ β€” Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти для Π±ΡƒΡ„Π΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ StrAlloc ΠΈΠ»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, слСдуСт ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ StrDispose. ΠŸΡ€ΠΈ этом ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ try/finally, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ°ΠΌ памяти.