繁体   English   中英

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

[英]Allocate memory in a C++ dll, free in C#

我是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))

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM