【问题标题】:How to free memory allocated in C# to an IntPtr passed from C++ dll?如何将 C# 中分配的内存释放给从 C++ dll 传递的 IntPtr?
【发布时间】:2019-02-26 21:33:57
【问题描述】:

一个指针从 C++ dll 传递给我,如下所示:

[DllImport("myfile.dll", EntryPoint = "LoadFile", SetLastError = true, CharSet = CharSet.None)]
public static extern IntPtr dLoadFile(string x);

IntPtr p = dLoadFile("myfile");

//Do things with p.

Marshal.FreeHGlobal(p) //crash on this line with exception below.

System.Runtime.InteropServices.COMException: '一个或多个参数 无效(HRESULT 异常:0x80000003)'

我应该释放分配给 IntPtr 的内存吗?如果是的话,如何正确地做到这一点? 显然,Marshal.FreeHGlobal() 似乎不是要走的路……

谢谢

【问题讨论】:

标签: c# dll marshalling


【解决方案1】:

一般规则是“需要调用谁分配资源来执行清理”。在 c# 中,您不拥有内存:clr 拥有它。您共享的 c# 程序集也共享 clr,因此您的印象是在一个程序集中创建一个对象并在另一个程序集中释放它。在执行互操作性时,由库创建的资源应由同一个库通过额外的导出 api 清理。不过也有一些例外,它们会考虑创建操作系统对象的时间:根据相关对象的特定文档,您可以在调用方站点释放资源。

在您的情况下,您应该在我的 file.dll 中导出适当的 api,以便正确执行清理。

此规则允许您不透露内部详细信息,从而允许您在不中断调用者的情况下更改内部信息。

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 2011-01-18
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多