在C ++ dll中分配内存,在C#中免费

时间:2019-05-17 06:51:20

标签: c# c++ memory-management

我是C#的新手,正在尝试与C ++ dll通信C#。我的主要目的是使用Marshal.AllocHGlobal()在C#中分配内存,在其中分配值,并将IntPtr的引用传递给C ++ dll。在C ++ dll方面,我正在使用malloc()更改分配的内存大小,并分配变量。最后,我在C#中打印值。到目前为止,一切正常。

但是当我尝试使用Marshal.FreeHGlobal()释放C#中分配的内存时,出现错误。

实际上,我在如何使用这些功能实现代码方面进行了大量研究。我找到了一个解决方案,说我必须在DLL中编写一个用于释放内存的函数并调用此函数。但是我的经理告诉我,我需要在C#端完成这项工作。因此,我无法使用该解决方案。另外,我发现了其他一些使用COM的想法,但管理器不想使用COM。所以我不能使用COM。这里是一些代码;

在C#中分配内存

var offset = 0;
var size = Marshal.SizeOf(typeof(dVehicle)) * denemeVehicle.Count();
IntPtr vehPnt;
vehPnt = Marshal.AllocHGlobal(size);

for(var i = 0; i < denemeVehicle.Count(); i++)
{
    Marshal.StructureToPtr(denemeVehicle[i], new IntPtr(vehPnt.ToInt64() + offset), false);
    offset += Marshal.SizeOf(typeof(dVehicle));
}

更改C ++中分配的内存大小

*vehicles = (dVehicle*) malloc(sizeof(dVehicle) * (new_VehSize));

释放分配的内存

Marshal.FreeHGlobal(vehPnt); // The error shows up in here

这是错误消息;

  

句柄无效。 (来自HRESULT的异常:0x80070006(E_HANDLE))

1 个答案:

答案 0 :(得分:3)

Marshal.FreeHGlobal()无法释放使用C malloc()函数分配的内存。内存必须“来自[[Marshal。] AllocHGlobal,[Marshal。] ReAllocHGlobal,或任何等效的非托管API方法”分配的全局堆。

内部,Marshal.AllocHGlobal()Marshal.FreeHGlobal()使用Win32 LocalAlloc()LocalFree()函数。在MSDN上有记录。

否则,如果您希望DLL根据需要分配内存,则必须使C#代码将分配的指针传递回DLL,以便可以正确释放它,即使用C free()如果内存是用malloc()分配的,则函数起作用。

如果两个模块彼此共享内存,但在公共内存管理器(例如操作系统提供的内存管理器)上不一致,则分配内存的模块必须是同一模块才能释放内存,因为唯一知道如何分配内存以及如何释放内存的模块。