繁体   English   中英

如何将在 C# 中分配的内存释放给从 C++ dll 传递的 IntPtr?

[英]How to free memory allocated in C# to an IntPtr passed from C++ dll?

一个指针从 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# 中,您不拥有内存:clr 拥有它。 您共享的 c# 程序集也共享 clr,因此您的印象是在一个程序集中创建一个对象并在另一个程序集中释放它。 在执行互操作性时,库创建的资源应该由同一个库通过额外的导出 api 进行清理。 但是有一些例外,它们会考虑何时创建操作系统对象:根据相关对象的特定文档,您可以在调用者站点释放资源。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM