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

标签 .net memory-management .net-core

考虑以下方法,我将 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

They use malloc

OSX?

malloc_zone_malloc

顺便说一句,针对您的用例的最佳解决方案不是使用这些与 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/

相关文章:

c# - .NET Core 中的 Nuget 依赖项

.net-core - .NET Standard 2.0和System.Security.Cryptography.ProtectedData.Protect

c# - 什么是 async 和 await,什么时候在 Windows 开发中使用它们?

c# - 页眉和页脚在 log4net 日志中出现两倍以上

iphone - 具有大图像尺寸的 UIImage - 内存问题 - 崩溃

iphone - 为什么不使用 self 。类内调用

mysql - 向远程 MySql 服务器添加数据时发生错误

c# - 将 ICC 颜色配置文件应用于 C# (Dotnet) 中的图像

.net - 从命令行调用 MSBuild 时转义 DisabledWarnings 的正确方法是什么?

android - 钛内存管理