我尝试从 dll 函数返回我自己的对象(源自 TCollection)。我使用了FastMemoryManager,但没有成功......所以我尝试返回一些对象的动态数组。
当然在dll函数中设置的数组的长度。
它工作得很好,但分配的内存没有被释放。
(我使用 Windows 任务管理器进行测量)。是否有可能如何释放动态数组?
调用dll函数的过程是在线程中的,最后我有如下:
for i := 0 to length(MyObjectArray) - 1 do begin
if MyObjectArray[i] <> nil then
MyObjectArray[i].Free;
end;
Setlength(MyObjectArray, 0);
MyObjectArray := nil;
如果我使用 Setlength(MyObjectArray, 0) 和 MyObjectArray := nil 来代替,
FreeAndNil(MyObjectArray) 则会引发异常。
有什么建议吗?
最佳答案
ShareMem 是所有 Delphi DLL 和 EXE 项目文件中的第一个单元吗? FastMM 已经是过去几个 Delphi 版本的 RTL 内存管理器。
我建议不要在 DLL 和 EXE 之间共享对象;这只是一种痛苦的处方。请改用包。
如果您必须使用 DLL,我建议采用常用的 WinAPI 约定:stdcall 调用约定,仅使用 C 兼容的数据类型(整数、 float 、指针、没有托管类型字段的记录,如字符串、数组或接口(interface))。让 DLL 不分配由 EXE 负责释放的内存。相反,让 EXE 分配内存并将其传递给 DLL;或者,将分配封装到逻辑句柄中,并导出从 DLL 中处理内存的函数,例如: CloseHandle
WinAPI 函数如何工作。
关于arrays - 从 Dll 返回 TCollection 或对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708458/