在 C# 中调用 Dispose 时不调用 C++/CLI 析构函数

所以我在 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++/命令行界面


public ref class ClassA: System::IDisposable {

...

    ClassA::~ClassA()

    {

        // Clean up code

    }


    ClassA::!ClassA()

    {

        // Clean up code

    }

}

如果这个问题已经得到回答,我深表歉意,但我已经尝试过,但在堆栈溢出时找不到它。


炎炎设计
浏览 110回答 1
1回答

小唯快跑啊

Ahhh 找到了原因,即使我在 Visual Studio 中关闭了优化,它也会自动将我的析构函数优化为我在析构函数中进行的第一个函数调用。因此,即使断点看起来有效,我也不得不在我的其他函数中放置一个断点以获取调用堆栈。(有趣的一点是调用堆栈直接从 Dispose(bool) 转到我的函数并跳过了析构函数)
打开App,查看更多内容
随时随地看视频慕课网APP