| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Данные полученные от DLL |
| Автор: XperT 10.2.2014, 23:20 | ||
| Есть функция в DLL которая возвращает PChar строку. Кто отвечает за освобождение памяти после её использования? Делфи сама подчищает или нужно мне за этим следить? Пример:
Боюсь, что есть утечки памяти. |
| Автор: superVad 11.2.2014, 22:31 |
| XperT, боятся утечек не надо Юзай 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 тут не покажет утечек. |
| Автор: Alexeis 13.2.2014, 16:55 | ||
Обычно следуют такому правилу - Если функция приняла указатель на строку, то этот указатель является валидным только на время работы функции. Поэтому, если функция хочет куда-то сохранить этот указатель, то она должна делать у себя локальную копию строки. Также и любой объект, если он не имеет механизма управления временем жизни (как например подсчет ссылок) обычно уничтожается тем кто его создавал. Если же созданная строка (объект), все же передается во владение, то должен также предоставляться механизм уничтожения. К примеру COM строка создается SysAllocString уничтожается SysFreeString. Объект окна создается CreateWindow, уничтожается CloseHandle и т.д. PChar - это указатель, без счетчика ссылок и автоматического управления временем жизни. |