如何在delphi应用程序中释放c ++ dll中的内存分配

Hao*_*zes 4 delphi memory-leaks delphi-2010

我在c/c ++ dll中使用mem分配问题并用delphi调用它,这样:

用c/c ++创建一个dll

#include "MemTestDll.h"

extern "C" EXPORTAPI char* __cdecl Test()
{
    char* str=new char[1024*1024*2];
    return str;
}
Run Code Online (Sandbox Code Playgroud)

然后在德尔福:

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;
Run Code Online (Sandbox Code Playgroud)

我看到任务管理器,每次点击都会泄漏8 KB内存.

  1. 我该如何发布ptr?FreeMem这个指针会使应用程序崩溃

  2. 我在C/C++ dll中分配1024*1024*2字节,为什么它显示泄漏8KB?

pad*_*ddy 7

跨越DLL边界使用动态内存的规则是,分配内存的人也必须释放它.您不能在DLL中分配内存,然后在DLL外部释放它.所以你应该在你的DLL中提供另一个释放指针的函数.

  • 这是在任何地方使用DLL*的基本规则* (3认同)
  • 豪斯:如果你有一个共享的内存管理器,你就可以逃脱.但这是一个坏主意,因为其他人可能会导入你的dll并且不使用内存管理器.这就是为什么,例如,许多Windows API调用都将缓冲区和缓冲区大小作为参数.你说"告诉我这个,把答案放在我为你分配的这块记忆中".其中大多数,如果您将大小设置为零,将返回他们需要的大小. (2认同)
  • 理论上,dll应该可以使用OS API调用来分配内存,然后应用程序可以使用相应的OS调用释放内存以释放内存.但通常情况并非如此,因为所有编程语言都带有内置的内存管理器,这些内存管理器在OS API调用之上添加了另一层,并且dll使用它们. (2认同)