如何在c++;delphi应用中的动态链接库
我对c/c++dll中的mem allocate有一个问题,用delphi调用它, 像这样的事情: 使用c/c创建dll++如何在c++;delphi应用中的动态链接库,delphi,memory-leaks,delphi-2010,Delphi,Memory Leaks,Delphi 2010,我对c/c++dll中的mem allocate有一个问题,用delphi调用它, 像这样的事情: 使用c/c创建dll++ #include "MemTestDll.h" extern "C" EXPORTAPI char* __cdecl Test() { char* str=new char[1024*1024*2]; return str; } 然后在delphi中: function Test():PAnsiChar; cdecl; external 'MemTe
#include "MemTestDll.h"
extern "C" EXPORTAPI char* __cdecl Test()
{
char* str=new char[1024*1024*2];
return str;
}
然后在delphi中:
function Test():PAnsiChar; cdecl; external 'MemTestDll.dll';
procedure TForm3.btn3Click(Sender: TObject);
var
ptr:PAnsiChar;
begin
ptr:=Test();
//FreeMem(ptr); // crash
//SysFreeMem(ptr) //crash too
end;
我看到taskmanager,每次单击都会泄漏8KB内存
跨DLL边界使用动态内存的规则是,分配内存的人也必须释放内存。不能在DLL中分配内存,然后在DLL外部释放内存。因此,您应该在DLL中提供另一个释放指针的函数。是windows DLL规则还是delphi规则?当我用C++调用C/C++ +DLL时,删除调用方中的指针,没关系。我不知道我应该在调用者中分配多少大小,所以我必须在调用者中释放它。这是在任何地方使用DLL的一条基本规则haozes:如果您有一个共享内存管理器,您可以不受影响。但这不是一个好主意,因为其他人可能会导入您的dll而不使用内存管理器。例如,这就是为什么许多windows API调用都将缓冲区和缓冲区大小作为参数。你说的是“告诉我这个,把答案放进我分配给你的这段记忆中”。如果将大小设置为零,则大多数dll将返回所需的大小。理论上,dll可以使用OS API调用来分配内存,然后应用程序可以使用相应的OS调用释放内存。不过,通常情况并非如此,因为所有编程语言都自带内置内存管理器,在OS API调用之上添加另一层,DLL使用它们。