[英]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.