如何在c++;delphi应用中的动态链接库

如何在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

我对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 'MemTestDll.dll';

procedure TForm3.btn3Click(Sender: TObject);
var
  ptr:PAnsiChar;
begin
   ptr:=Test();
  //FreeMem(ptr); // crash
  //SysFreeMem(ptr) //crash too
end;
我看到taskmanager,每次单击都会泄漏8KB内存

  • 如何发布ptr?FreeMem此指针将使应用程序崩溃

  • 我在C/C++dll中分配了1024*1024*2字节,为什么它显示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使用它们。