c# - 如何在 C# 中释放 IntPtr?

标签 c# interop pinvoke

如何释放 ptrSentFromPinvokedDLL?

IntPtr ptrSentFromPinvokedDLL= IntPtr.Zero;

int resultFromVendor = CallVendorDll(ref ptrSentFromPinvokedDLL);

resultFromVendor = DoMoreWorkFromVendorDLL(
    ptrSentFromPinvokedDLL, "workonthis");

// Free ptrSentFromPinvokedDLLhere

最佳答案

理想情况下,供应商会担心这一点,或者会有一个供应商函数来释放内存。如果不是,您需要知道供应商是如何分配内存的。例如,如果供应商使用 LocalAlloc 分配内存在 kernel32.dll 中,您可以使用 Marshal.FreeHGlobal(IntPtr) 释放内存.同样,如果 COM 内存分配器 CoTaskMemAlloc当时用过Marshal.FreeCoTaskMem(IntPtr)将用于释放内存。因此,请检查文档并相应地进行。

作为引用,这里有一个不错的 MSDN article关于内存分配模型。

关于c# - 如何在 C# 中释放 IntPtr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2159150/

相关文章:

c# - Linq 过滤器 List<string> 其中包含来自另一个 List<string> 的字符串值

c# - 更新面板内部回发问题

c# - 如何在 C# 互操作中使用 InternetQueryOption?

c - 用于调用返回指针的 C 函数的 Fortran 接口(interface)

c# - 更改框架 4.0 中数组的 Com Interop 表示?

c# - 重置光标.Clip

c# - 比 Marshall.QueryInterface 更简洁的编码方式?

c# - 在 C++ 和 C# 之间传递 vector 结构

wpf - 如何从 WPF 应用程序打开 MFC 对话框?

c# - Entity Framework 只读集合