Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Данные полученные от DLL 
:(
    Опции темы
XperT
Дата 10.2.2014, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



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

Пример:

Код

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


Боюсь, что есть утечки памяти.
PM MAIL   Вверх
superVad
Дата 11.2.2014, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 4
Всего: 15



XperT, боятся утечек не надо smile
Юзай FastMM, он тебе при выходе из программы покажет были ли утечки.
Вот ссылка.
PM MAIL   Вверх
kami
Дата 12.2.2014, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



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

Кто хорошо разбирается в этой теме, подскажите, а...
PM MAIL WWW   Вверх
Poseidon
Дата 12.2.2014, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
bems
Дата 13.2.2014, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



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

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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Alexeis
Дата 13.2.2014, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1307 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.