考虑以下将我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呢?
答案 0 :(得分:2)
关于Linux
OSX?
顺便说一句,针对您的用例的最佳解决方案是不使用与Marshal.FreeHGlobal
兼容的特定于平台的内容,而是导出例如void freeMemory(void* ptr)
出自您的本机dll / so / dylib。这样,在您的本机库中,您可以使用任何方法进行分配/释放,例如malloc / free是最直接和最兼容的,它将在所有平台上运行。或者您可以使用来自FreeBSD的jemalloc库,以提高性能。