Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2014, 11:32   #1
xper13
 
Аватар для xper13
 
Регистрация: 04.04.2011
Сообщений: 4
По умолчанию Данные полученные от DLL (кто очищает)

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

Пример:

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

Боюсь, что есть утечки памяти.
xper13 вне форума Ответить с цитированием
Старый 11.02.2014, 11:38   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

DLL не знает когда ресурс освобождается от использования. В большнистве случаев, отвечает разрабоотчик ПО а не DLL.
Человек_Борща вне форума Ответить с цитированием
Старый 11.02.2014, 11:42   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Зависит от вашей ДЛЛ, смотрите в ней.

смотря как строка была сформирована.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.02.2014, 11:59   #4
xper13
 
Аватар для xper13
 
Регистрация: 04.04.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
DLL не знает когда ресурс освобождается от использования. В большнистве случаев, отвечает разрабоотчик ПО а не DLL.
Это понятно. Как её освобождать эту память? Через StrDispose?

Цитата:
Зависит от вашей ДЛЛ, смотрите в ней.

смотря как строка была сформирована.
DLL сишная, код формирования строки примерно такой:

Код:
{
...
TCHAR * sResult = new TCHAR[iLength];
_tcscpy(sResult, sSomeString);	
sResult[iLength - 1] = '\0';

return sResult;
}
xper13 вне форума Ответить с цитированием
Старый 11.02.2014, 12:05   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от xper13 Посмотреть сообщение
Это понятно. Как её освобождать эту память? Через StrDispose?


DLL сишная, код формирования строки примерно такой:

Код:
{
...
TCHAR * sResult = new TCHAR[iLength];
_tcscpy(sResult, sSomeString);	
sResult[iLength - 1] = '\0';

return sResult;
}
по хорошему нужно либо применять АПИшные аллоки и АПИшными же вычищать.
либо чтоб в ДЛЛ была функция для очистки памяти.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.02.2014, 12:17   #6
xper13
 
Аватар для xper13
 
Регистрация: 04.04.2011
Сообщений: 4
По умолчанию

Цитата:
по хорошему нужно либо применять АПИшные аллоки и АПИшными же вычищать.
Подскажите, что за функции?

Цитата:
либо чтоб в ДЛЛ была функция для очистки памяти.
Этот вариант мне не очень нравится, потому что, на сколько я понимаю, в DLL должна быть глобальная переменная в которую необходимо записывать результат и на которую потом же необходимо давать ссылку.
xper13 вне форума Ответить с цитированием
Старый 11.02.2014, 13:08   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от xper13 Посмотреть сообщение
Подскажите, что за функции?


Этот вариант мне не очень нравится, потому что, на сколько я понимаю, в DLL должна быть глобальная переменная в которую необходимо записывать результат и на которую потом же необходимо давать ссылку.
1)читаем msdn функции Heap*.
2)причем тут глобальная переменная?

просто экспортируете функцию вида:
Код:
void DELETE(void*ptr)
{
    delete[] ptr;
}
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.02.2014, 14:32   #8
xper13
 
Аватар для xper13
 
Регистрация: 04.04.2011
Сообщений: 4
По умолчанию

Ок, понял, спасибо.
xper13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести данные полученные от программы Shouldercannon PHP 4 24.10.2013 16:29
Не очищает поля Repac123456 Помощь студентам 4 04.01.2011 23:48
Как записать данные в таблицу полученные методом расчета? GenaRu Microsoft Office Access 3 18.12.2009 20:52
как сложить данные полученные из запроса к MS SQL SERVER ? xxxsas SQL, базы данных 2 09.01.2009 17:28
как сложить данные полученные из запроса? xxxsas SQL, базы данных 0 27.11.2008 01:44