在 C# 中调用 Dispose 时不调用 C++/CLI 析构函数
C++/CLI Destructor not called when Dispose is called in C#
所以我在 C# 对象中保存了一个 C++/CLI 对象。我在我的 C++/CLI 对象上调用 dispose,我在 C++/CLI 析构函数和终结器中都有一个断点。
我知道 .NET 应该为 CLI 对象自动生成一个 Dispose 并将析构函数放在那里,但我在析构函数中的断点只是没有被击中。有人可以解释一下我的情况吗,因为我找不到任何关于此行为的文档。
C#
public void Dispose()
{
foreach (var wrapper in m_items)
{
var disposable = wrapper.Data as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
}
C++/CLI
public ref class ClassA: System::IDisposable {
...
ClassA::~ClassA()
{
// Clean up code
}
ClassA::!ClassA()
{
// Clean up code
}
}
如果这个问题已经得到回答,我深表歉意,但我已经尝试过,但在堆栈溢出时找不到它。
啊啊找到原因了,即使我在 Visual Studio 中关闭了优化,它也会自动优化我的 Destructor 到我在 Destructor 中的第一个函数调用中。
因此,即使断点看起来有效,我也不得不在我的其他函数中放置一个断点以获取调用堆栈。 (有趣的一点是调用堆栈直接从 Dispose(bool) 转到我的函数并跳过了析构函数)
所以我在 C# 对象中保存了一个 C++/CLI 对象。我在我的 C++/CLI 对象上调用 dispose,我在 C++/CLI 析构函数和终结器中都有一个断点。
我知道 .NET 应该为 CLI 对象自动生成一个 Dispose 并将析构函数放在那里,但我在析构函数中的断点只是没有被击中。有人可以解释一下我的情况吗,因为我找不到任何关于此行为的文档。
C#
public void Dispose()
{
foreach (var wrapper in m_items)
{
var disposable = wrapper.Data as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
}
C++/CLI
public ref class ClassA: System::IDisposable {
...
ClassA::~ClassA()
{
// Clean up code
}
ClassA::!ClassA()
{
// Clean up code
}
}
如果这个问题已经得到回答,我深表歉意,但我已经尝试过,但在堆栈溢出时找不到它。
啊啊找到原因了,即使我在 Visual Studio 中关闭了优化,它也会自动优化我的 Destructor 到我在 Destructor 中的第一个函数调用中。
因此,即使断点看起来有效,我也不得不在我的其他函数中放置一个断点以获取调用堆栈。 (有趣的一点是调用堆栈直接从 Dispose(bool) 转到我的函数并跳过了析构函数)