释放非托管内存
要想成功地在托管代码中释放掉非托管函数分配的内存,第一步也是最重要的一步是:确定非托管内存是由哪种方式分配的。
非托管代码分配内存主要有3种方式:C语言中的malloc/free
,C++的new/delete
,COM中的CoTaskMemAlloc/CoTaskMemFree
。
如果是前两种方法分配的,那么在托管代码中不能直接对其进行释放,必须在非托管代码中实现一个释放内存的函数,然后被托管代码调用。
释放malloc分配的内存
一个方法是改用COM的内存分配方式。另一个方法是定义一个释放内存的非托管函数。
void FreeMallocMemory(void* ptr)
{
if(NLL != ptr)
{
free(ptr);
ptr = NULL;
}
}
[DllImport("NativeLib.dll", CallingConvertion = CallingConverton.Cdecl, CharSet = CharSet.Unicode)]
static extern void FreeMallocMemory(IntPtr ptr);
释放由new分配的内存
与之前解决此问题的办法完全相同,要么改变非托管函数的内存分配方式为COM的方法,要么新增一个能够释放掉非托管内存的非托管函数。
(END)