Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Данные полученные от DLL


Автор: XperT 10.2.2014, 23:20
Есть функция в DLL которая возвращает PChar строку. Кто отвечает за освобождение памяти после её использования? Делфи сама подчищает или нужно мне за этим следить?

Пример:

Код

var
  str : PChar;
begin
  str := GiveMeSomeString(); // Вызов функции из DLL-ки
  ShowMessage(str);
end;


Боюсь, что есть утечки памяти.

Автор: superVad 11.2.2014, 22:31
XperT, боятся утечек не надо smile
Юзай FastMM, он тебе при выходе из программы покажет были ли утечки.
Вот http://www.gunsmoker.ru/2009/05/blog-post_24.html.

Автор: kami 12.2.2014, 08:20
У длл и приложения - разные менеджеры памяти.  Посему - FastMM приложения явно не покажет утечку, т.к. в программе память-то не выделялась.
Дальше - пошли догадки. В приложении вызывать FreeMem вроде как бесполезно, не? FastMM прошерстит выделенные блоки, не обнаружит нужного и спокойно вернет управление, ничего не делая. А вот в dll - будет эта самая утечка, т.к. ее менеджер памяти выделил блок, а обратно его не получит. Вернее, утечка-то будет общей, т.к. память выделена под процесс вцелом... Получается, в dll нужно создавать еще одну функцию - освобождения полученного. Или же менять существующую, передавая в нее указатель на уже выделенный блок памяти.

Кто хорошо разбирается в этой теме, подскажите, а...

Автор: Poseidon 12.2.2014, 19:19
GiveMeSomeString возвращает PChar? Если так, то утечка на лицо. При чем утечка не в exe, а в dll. Что такое PChar? Это указатель. Указатель на что? На область памяти, которая уже кем-то выделена. GiveMeSomeString вернет нам указатель на эту память. При выходе из области видимости значение этого указателя (которое в str) очистится, но сама память не освободится. kami, прав. Нужно освобождать эту память в dll. Можно отдельную функцию писать и вызывать ее, можно в finalize в модуле dll. Все зависит от того, как работает с этой памятью dll. FastMM тут не покажет утечек.

Автор: bems 13.2.2014, 15:06
Цитата(kami @  12.2.2014,  08:20 Найти цитируемый пост)
FastMM прошерстит выделенные блоки, не обнаружит нужного и спокойно вернет управление, ничего не делая
помнится в этом случае он кидал эксцепшн

XperT, дллка твоя или чужая?

Автор: Alexeis 13.2.2014, 16:55
Цитата(XperT @  11.2.2014,  00:20 Найти цитируемый пост)
Кто отвечает за освобождение памяти после её использования? Делфи сама подчищает или нужно мне за этим следить?

  Обычно следуют такому правилу -  Если функция приняла указатель на строку, то этот указатель является валидным только на время работы функции. Поэтому, если функция хочет куда-то сохранить этот указатель, то она должна делать у себя локальную копию строки. Также и любой объект, если он не имеет механизма управления временем жизни (как например подсчет ссылок) обычно уничтожается тем кто его создавал. Если же созданная строка (объект), все же передается во владение, то должен также предоставляться механизм уничтожения. К примеру COM строка создается SysAllocString  уничтожается SysFreeString. Объект окна создается CreateWindow, уничтожается CloseHandle и т.д.
  PChar - это указатель, без счетчика ссылок и автоматического управления временем жизни.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)