|
Модераторы: Poseidon, Snowy, bems, MetalFan |
|
XperT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 269 Регистрация: 19.8.2006 Репутация: 2 Всего: 4 |
Есть функция в DLL которая возвращает PChar строку. Кто отвечает за освобождение памяти после её использования? Делфи сама подчищает или нужно мне за этим следить?
Пример:
Боюсь, что есть утечки памяти. |
|||
|
||||
superVad |
|
|||
Опытный Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
XperT, боятся утечек не надо
Юзай FastMM, он тебе при выходе из программы покажет были ли утечки. Вот ссылка. |
|||
|
||||
kami |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 23 Всего: 72 |
У длл и приложения - разные менеджеры памяти. Посему - FastMM приложения явно не покажет утечку, т.к. в программе память-то не выделялась.
Дальше - пошли догадки. В приложении вызывать FreeMem вроде как бесполезно, не? FastMM прошерстит выделенные блоки, не обнаружит нужного и спокойно вернет управление, ничего не делая. А вот в dll - будет эта самая утечка, т.к. ее менеджер памяти выделил блок, а обратно его не получит. Вернее, утечка-то будет общей, т.к. память выделена под процесс вцелом... Получается, в dll нужно создавать еще одну функцию - освобождения полученного. Или же менять существующую, передавая в нее указатель на уже выделенный блок памяти. Кто хорошо разбирается в этой теме, подскажите, а... |
|||
|
||||
Poseidon |
|
|||
Delphi developer Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
GiveMeSomeString возвращает PChar? Если так, то утечка на лицо. При чем утечка не в exe, а в dll. Что такое PChar? Это указатель. Указатель на что? На область памяти, которая уже кем-то выделена. GiveMeSomeString вернет нам указатель на эту память. При выходе из области видимости значение этого указателя (которое в str) очистится, но сама память не освободится. kami, прав. Нужно освобождать эту память в dll. Можно отдельную функцию писать и вызывать ее, можно в finalize в модуле dll. Все зависит от того, как работает с этой памятью dll. FastMM тут не покажет утечек.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
bems |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
XperT, дллка твоя или чужая? -------------------- Обижено школьников: 8 |
|||
|
||||
Alexeis |
|
|||
Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Обычно следуют такому правилу - Если функция приняла указатель на строку, то этот указатель является валидным только на время работы функции. Поэтому, если функция хочет куда-то сохранить этот указатель, то она должна делать у себя локальную копию строки. Также и любой объект, если он не имеет механизма управления временем жизни (как например подсчет ссылок) обычно уничтожается тем кто его создавал. Если же созданная строка (объект), все же передается во владение, то должен также предоставляться механизм уничтожения. К примеру COM строка создается SysAllocString уничтожается SysFreeString. Объект окна создается CreateWindow, уничтожается CloseHandle и т.д. PChar - это указатель, без счетчика ссылок и автоматического управления временем жизни. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |