簡體   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