gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:27 26 4
gpt4 key购买 nike

我有一个名为“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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com