考虑以下方法,我将 DllImport
导入 .NET IntPtr
。
void* getenv()
{
return malloc(10);
}
如果我对生成的 IntPtr
执行 Marshal.FreeHGlobal
,我的应用程序会崩溃。
不过,如果我使用以下 native 代码,上述场景将会成功。
void* qt_getenv(LPCSTR name)
{
return LocalAlloc(0, 10);
}
所以,很明显我不能释放从托管代码返回的任何东西,除非我用 LocalAlloc
分配它。
据我了解,LocalAlloc
是特定于 Windows 的。 Linux/OSX 怎么样?
最佳答案
What about Linux
OSX?
顺便说一句,针对您的用例的最佳解决方案不是使用这些与 Marshal.FreeHGlobal
兼容的特定于平台的东西,而是导出例如void freeMemory(void* ptr)
从您的 native dll/so/dylib 中删除。这样,在您的 native 库中,您可以使用任何方法来分配/释放,例如malloc/free 是最直接和最兼容的,它适用于所有平台。或者你可以使用例如jemalloc来自 FreeBSD 的库以获得更好的性能。
关于.NET Core 互操作,Marshal.FreeHGlobal 使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51599378/