【问题标题】:Should I free all of IntPtr's with FreeHGlobal once I'm done with them? [closed]完成所有 IntPtr 后,是否应该使用 FreeHGlobal 释放它们? [关闭]
【发布时间】:2021-01-19 21:43:11
【问题描述】:

我的项目中有很多 IntPtr,其中一些是从我的 dll 返回的,因此我没有使用 Marshal.AllocHGlobal() 为它们分配内存

[DllImport(Dll, CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr CreatePart(IntPtr partId);

我应该如何释放这些从 dll 函数返回的 IntPtrs?

Marshal.FreeHGlobal()variable = IntPtr.Zero 或两者?

我在这个网站和微软文档上阅读了一些问题,他们说Marshal.FreeHGlobal 应该用于任何使用Marshal.AllocHGlobal 分配的内存。 如果我们没有为IntPtr分配内存怎么办

感谢您阅读我的问题。

【问题讨论】:

  • 请看stackoverflow.com/help/how-to-ask,这不是一个好问题,主要会吸引各种意见。
  • @SimonPrice 我的问题有什么问题?我想知道我是否必须手动释放它们,否则它们会自动释放
  • 没有看到您的代码,无法明确给出建议。但是不,如果您不分配任何内存,您根本不需要这些选项中的任何一个。设置为 Zero 是无操作的,因为 GC 对 IntPtr 没有任何作用,它只是一个数字。
  • @Charlieface 所以我基本上可以在完成后留下我的 IntPtr 吗?例如,如果我使用返回 IntPtr 的GetProcAddress,我可以使用返回的 IntPtr 并留下它吗?我说的对吗?
  • 正确,但edit 并添加您的代码以删除反对票

标签: c# memory-management garbage-collection marshalling intptr


【解决方案1】:

我应该如何释放这些从 dll 函数返回的 IntPtr?

这取决于 CreatePart 的本机实现,但通常是通过将返回的指针传递给另一个名为 DestroyPart 的本机方法,或者在您完成后传递给其他方法。

您是否可以实际使用Marshal.FreeHGlobal 来释放内存取决于分配内存的本机方法的实现。释放内存的方式必须与分配内存的方式相匹配。

IntPtr 本身只是一个值类型:

Just what is an IntPtr exactly?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 2019-01-15
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多