.NET Core互操作,Marshal.FreeHGlobal崩溃程序

时间:2018-07-30 17:30:17

标签: .net memory-management .net-core

考虑以下将我DllImport插入.NET IntPtr的方法。

void* getenv()
{
    return malloc(10);
}

如果我对生成的Marshal.FreeHGlobal执行IntPtr,则我的应用会崩溃。

如果我使用以下本机代码,上述情况将成功。

void* qt_getenv(LPCSTR name)
{
    return LocalAlloc(0, 10);
}

因此,很明显,除非使用LocalAlloc进行分配,否则我无法释放托管代码返回的任何内容。

据我了解,LocalAlloc是Windows特定的。那么Linux / OSX呢?

1 个答案:

答案 0 :(得分:2)

  

关于Linux

They use malloc

  

OSX?

malloc_zone_malloc

顺便说一句,针对您的用例的最佳解决方案是不使用与Marshal.FreeHGlobal兼容的特定于平台的内容,而是导出例如void freeMemory(void* ptr)出自您的本机dll / so / dylib。这样,在您的本机库中,您可以使用任何方法进行分配/释放,例如malloc / free是最直接和最兼容的,它将在所有平台上运行。或者您可以使用来自FreeBSD的jemalloc库,以提高性能。