zhouqijie

释放非托管内存

要想成功地在托管代码中释放掉非托管函数分配的内存,第一步也是最重要的一步是:确定非托管内存是由哪种方式分配的。

非托管代码分配内存主要有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)