![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AnsiExtractQuotedStr(PChar(str), ...)
RWolf © (2009-10-21 11:24:00)Функция AnsiExtractQuotedStr принимает аргумент PChar и меняет его (указатель, а не строку) на выходе. Не может ли произойти утечки памяти при передаче ей конструкции PChar(str), где str:string?
т.е. где контролируется, что было выделено под копию строки str столько-то памяти по такому-то адресу, которую нужно освободить при возврате из функции?
Anatoly Podgoretsky (2009-10-21 14:04:00) [1]> RWolf (21.10.2009 13:19:06) [6]
Именно так, AnsiString полностью совместимы с PChar
RWolf (2009-10-21 13:19:00) [2]
> Anatoly Podgoretsky
то есть, за паскалевской строкой в обязательном порядке резервируется нулевой символ?
Anatoly Podgoretsky (2009-10-21 13:03:00) [3]p:=PChar
Никакого отношения к механизму управления строка не имеет, это автономный указатель.
Медвежонок Пятачок (2009-10-21 12:27:00) [4]Была строка (string).
Память освободится когда срока выйдет из зоны видимости.
Соответственно все пчары на нее протухнут автоматом.
Будь их хоть пятсот на одну и ту же строку
Медвежонок Пятачок (2009-10-21 12:24:00) [5]Допустим, я делаю копию строки: p:=PChar(str);
Здесь никакой копии не делается вообще.
Память была выдена под string и все.
И она по прежнему контролируется компилятором.
RWolf (2009-10-21 12:12:00) [6]да, верно — так передать синтаксис не позволит. Переформулирую. Допустим, я делаю копию строки: p:=PChar(str); и этот указатель передаю в функцию. Память под копию была выделена автоматически, и я ожидаю, что она так же автоматически и освободится, когда компилятор решит, что она больше не нужна. Не сломается ли этот механизм в случае, когда значение указателя изменяется в теле вызываемой функции?
Медвежонок Пятачок (2009-10-21 11:53:00) [7]при передаче ей конструкции PChar(str),
Такая передача не прокатит.
А утечка будет только если строка изначально создавалась через PChar и перед вызовом не сохранен оригинальный указатель на нее