【问题标题】:How to free IntPtr in C#?如何在 C# 中释放 IntPtr?
【发布时间】:2010-01-29 00:40:39
【问题描述】:

如何释放 ptrSentFromPinvokedDLL?

IntPtr ptrSentFromPinvokedDLL= IntPtr.Zero;

int resultFromVendor = CallVendorDll(ref ptrSentFromPinvokedDLL);

resultFromVendor = DoMoreWorkFromVendorDLL(
    ptrSentFromPinvokedDLL, "workonthis");

// Free ptrSentFromPinvokedDLLhere

【问题讨论】:

  • 那么,供应商是如何分配指针的?使用相应的释放器。
  • 假设你甚至需要释放它。

标签: c# interop pinvoke


【解决方案1】:

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

作为参考,这里有一个很好的MSDN article 关于内存分配模型。

【讨论】:

    【解决方案2】:

    如果没有看到CallVendorDll 中的代码,就无法知道如何释放它,或者是否需要释放它。 (或一些文档)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多