将IntPtr作为函数的参数传递会导致内存泄漏吗?

时间:2019-05-18 08:34:38

标签: c# .net f#

比方说我有IntPtr变量,它的值是通过调用WinApi函数(p / invoke)分配的。然后,我在10个不同的函数中传递了该值。由于IntPtr是struct(值类型),因此每个函数都将获得原始变量的副本。会导致内存泄漏吗?我应该关闭每个函数中原始变量的每个副本吗?

bioData

1 个答案:

答案 0 :(得分:0)

IntPtr通常用作句柄或指针值的占位符。很难从代码中确切地知道正在发生什么,但是复制句柄或指针值不会复制底层资源。

因此在您的示例中,一次CloseHandle似乎是正确的。我将其放入try..finally中,以确保如果CloseHandle返回有效句柄时始终调用WinApiFunction

[DllImport("WinApiFunction")]
public static extern bool WinApiFunction(int arg1, int arg2, out IntPrt result)

public void Foo()
{
  var result = IntPtr.Zero;
  if (!WinApiFunction(1, 2, out result) || result == IntPtr.Zero)
  {
    throw new Exception("Oops");
  }
  try
  {
    Foo1(result);
    Foo2(result);
  }
  finally
  {
    CloseHandle(result);
  }
}

如果要围绕此句柄构建一个代理类,请在用例上对代理类实现终结器(和IDisposable)。