C#/命令行界面 : Destructor not called if Dispose() used in it

标签 c# c++ command-line-interface destructor dispose

我有一个名为“CTransferManaged”的 C++/CLI 类,其中实现了终结器和析构函数:

CTransferManaged::~CTransferManaged()
{
    this->!CTransferManaged();
}
CTransferManaged::!CTransferManaged()
{
    //Clean up resources... 
}

此类由名为“CTransfer”的 C# 类包装,其中包含类型为 CTransferManaged 的​​对象 m_transfer。

如果此类的析构函数仅清除对对象 m_transfer 的引用,我可以看到调用了析构函数(命中断点):

~CTransfer()
{
    m_transfer = null; //breakpoint on this line
}

如果我在不更改任何其他内容的情况下调用 m_transfer 对象的 Dispose() 函数,则不再调用析构函数(不再命中断点)。猜猜为什么?

~CTransfer()
{
    m_transfer.Dispose(); //breakpoint on this line
    m_transfer = null;
}

我想手动调用 Dispose(),因为我发现如果我不手动调用 Dispose,C++/CLI 对象 (m_transfer) 的资源不会被正确清理。目前我不知道确切原因。

为什么 CTransfer(C# 类)的析构函数在调用 CTransferManaged::Dispose() (C++/CLI) 后不再立即调用?

最佳答案

C# 析构函数只能由垃圾收集器调用,您不能直接调用它。

作为 IDisposalbe 接口(interface)的一部分的 Dispose 只能手动调用,它不会触发析构函数。

不要依赖析构函数,而是尝试实现 iDisposabe 并直接调用 Dispose 方法并将您的代码放在那里。

如果 Resource 类包含应释放的嵌入式对象,则 C# 需要此模式:

// C#
public class Resource : IDisposable
{
   private EmbeddedResource embedded;

   public Resource()
   {
      Console.WriteLine("allocating resource");
      embedded = new EmbeddedResource();
   }

   ~Resource()
   {
      Dispose(false);
   }

   protected virtual void Dispose(bool disposing)
   {
      Console.WriteLine("release resource");
      if (disposing)
      {
         embedded.Dispose();
      }
   }

   public void Dispose()
   {
      Dispose(true);
   }
}

关于C#/命令行界面 : Destructor not called if Dispose() used in it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16966309/

相关文章:

c++ - omp 缩减和 lambda 函数

node.js - Heroku登录系统找不到指定路径

c# - 如何让我的按钮在 Unity 中使用 C# 做不同的事情?

c# - 如果您压缩包含随机数的文件,它会变大

c++ - 使用 Boost.Asio 只读取所需的字节数

python 点击​​命令的详细帮助

Clojure CLI 清屏

C# Serilog 在写入文件之前压缩日志消息?

c# - 使用 Copy Local 将程序集放在不同的目录中

c++ - 模板中的默认参数