是否所有 C++/CLI 对象都需要处置?

Do all C++/CLI objects require disposal?

我的理解(partly from reading threads here)是世界上每个 C++/CLI 对象都通过其 C++/CLI 析构函数自动实现 IDisposable。

我的 further understanding 是,每当您的托管 class A 使用另一个实现 IDisposable 的托管 class B 的实例时,您就有责任实现 IDisposable 某处(或使用"using" 语句)以确保调用B.Dispose。

这两个都正确吗?如果是这样,那么这意味着基本上每当我在 C# 代码的任何地方使用 C++/CLI 对象时,我都需要一个 IDisposable 实现或一个 using 来清理它。是吗?

这个我没有意识到

在我当前的应用程序设计中,none 我的 C# class 实际上 "own" 它们使用的任何 C++/CLI 对象实例。我倾向于自由地创建和传递它们。 class "A" 的 C# 对象可能会创建一个 C++/CLI 对象,然后将其传递给 C# class "B" 和 "Z" 的实例。所有 3 个都可能存储对它的引用所以 none 他们可以对其调用 Dispose 因为 none 他们拥有它。

如此有效,我得到了一大堆 IDisposable C++/CLI 对象,但没有人对它们调用 Dispose。

我认为这很好。只有少数我的 C++/CLI classes 分配了很大一部分内存。

这是我应该关心的事情吗?我是否应该尝试重新构建我的应用程序,以便每个 C++/CLI 对象都由一个且只有一个 C# 对象拥有,这样我就可以在 C# classes 上实现 IDisposable 并尽职地在底层 C++/CLI 上调用 Dispose实例?

简短的回答是,"no",所有 CLI 类 不需要处理。仅当未受管理的资源发挥作用​​时才需要进行处置。例如,在非托管堆上分配的文件句柄或内存。

编辑...

我不相信 "every C++/CLI class in the world implements IDisposable by design" 是正确的说法。准确地说 "every C++/CLI class which declares a finalizer implements IDisposable"。当在 C++ 中,你 delete 一个托管对象时,它的析构函数被调用,它应该依次调用它自己的终结器。当在 C# 中(例如)调用 Dispose()(显式或通过 using 块)时,将调用其终结器,这实际上意味着它实现了 IDisposable。如果没有终结器,则无法从 C# 等语言中正确处理对象。

https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/ms177197(v=vs.100)