Форум: "Основная";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];
ВнизКорректная работа с памятью. Найти похожие ветки
← →
pargo © (2006-05-05 11:31) [0]Корректен ли следующий код, если нет, то в чем ошибка ?
library TestDLL;
uses
SysUtils,
Windows;
procedure DLL_FreeMem(var pData:pByte); export; stdcall;
begin
ReallocMem(pData,0);
end;
procedure TestProc(var pData:pByte; var cbData:DWord); export; stdcall;
begin
cbData:=cbData+1024;
ReallocMem(pData,cbData);
end;
exports
DLL_FreeMem name "DLL_FreeMem",
TestProc name "TestProc;
begin
end.
В проекте:
procedure TestMem(var pData:pByte; var cbData:DWord);
begin
ReallocMem(pData,cbData);
TestProc(pData,cbData);
DLL_FreeMem(pData);
end;
← →
Сергей М. © (2006-05-05 11:37) [1]
> Корректен ли следующий код
Некорректен.
Хотя бы потому что когда-нибудь на месте тестового Делфи-приложения окажется реальное не-Делфи-приложение, которое будет использовать совершенно иной менеджер памяти.
← →
evvcom © (2006-05-05 11:51) [2]Даже для Дельфи-приложений мы имеем 2-х разных менеджеров. Один память выделяет, а другой, ничего об этом не зная, пытается ее перевыделить, а потом убить.
← →
Сергей М. © (2006-05-05 11:54) [3]
> evvcom © (05.05.06 11:51) [2]
Угу. В частном случае.
← →
pargo © (2006-05-05 12:02) [4]Подскажите, как сделать правильно ?
← →
TUser © (2006-05-05 12:07) [5]А что ты хочешь сделать?
← →
pargo © (2006-05-05 12:51) [6]Передать данные в DLL. Там обработать их ( при этом размер данных
меняется ) и вернуть обработанные данные в проект.
← →
Сергей М. © (2006-05-05 13:03) [7]
> pargo © (05.05.06 12:51) [6]
stdcall с какой целью тобой указан ? От балды ?
← →
pargo © (2006-05-05 13:07) [8]Сергей М. © (05.05.06 13:03) [7]
Просто указываю для всех экспортируемых функций, независимо
от количества параметров.
← →
balepa © (2006-05-05 13:10) [9]
> pargo © (05.05.06 13:07) [8]
> Просто указываю для всех экспортируемых функций, независимо
> от количества параметров.
Значит от балды
← →
Сергей М. © (2006-05-05 13:15) [10]
> pargo © (05.05.06 13:07) [8]
Именно от балды.
А следовало бы призадуматься над этой "балдой" ..
← →
evvcom © (2006-05-05 15:44) [11]Да, задуматься не мешает, о чем здесь говорилось. Но главная ошибка заключается в том, что память освобождать (перевыделять) надо там (в том модуле), где она запрашивалась.
← →
pargo © (2006-05-05 16:44) [12]Спасибо
← →
pargo © (2006-05-08 12:27) [13]Так будет корректно ?
library TestDLL;
uses
SysUtils,
Windows;
procedure DLL_ReallocMem(var pData:pByte;Size:DWord); export; stdcall;
begin
ReallocMem(pData,Size);
end;
procedure TestProc(var pData:pByte; var cbData:DWord); export; stdcall;
begin
cbData:=cbData+1024;
ReallocMem(pData,cbData);
end;
exports
DLL_ReallocMem name "DLL_ReallocMem",
TestProc name "TestProc;
begin
end.
В проекте:
procedure TestMem(var pData:pByte; var cbData:DWord);
begin
DLL_ReallocMem(pData,cbData);
TestProc(pData,cbData);
DLL_ReallocMem(pData,0);
end;
← →
Пусик © (2006-05-08 18:15) [14]
> pargo © (08.05.06 12:27) [13]
Так корректно.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c