我的理解(partly from reading threads here)是,世界上每个C ++ / CLI对象都会凭借其C ++ / CLI析构函数自动实现IDisposable。
我的further understanding是,只要您的托管类A使用另一个实现IDisposable的托管类B的实例,您就有责任在某个地方实现IDisposable (或使用“ using”语句)以确保调用了B.Dispose。
这些都正确吗?如果是这样,则意味着基本上在任何时候只要在C#代码的任何地方使用C ++ / CLI对象,我都需要一个IDisposable实现或使用来清理它。是吗?
这我没有意识到
在我目前的应用程序设计中,没有一个C#类真正“拥有”它们使用的任何C ++ / CLI对象实例。我倾向于自由创建和传递它们。类“ A”的C#对象可能会创建一个C ++ / CLI对象,然后将其交给C#类“ B”和“ Z”的实例。这3个对象都可能存储对它的引用,因此它们都不可以调用Dispose,因为它们都不拥有它。
因此,实际上,我有一大堆IDisposable C ++ / CLI对象,没有人曾经对它们调用过Dispose。
我认为这很好。我只有几个C ++ / CLI类分配很大一部分内存。
这是我应该关注的事情吗?我是否应该尝试重新构造应用程序,以便每个C ++ / CLI对象都由一个且仅一个C#对象拥有,以便我可以在C#类上实现IDisposable并按需在底层C ++ / CLI实例上调用Dispose?
答案 0 :(得分:1)
简短的回答是“否”,所有CLI类都不需要处理。只有在联合国管理的资源发挥作用时才需要进行处置。例如,文件句柄或在非托管堆上分配的内存。
编辑...
我不认为“世界上每个C ++ / CLI类都可以通过设计实现IDisposposable”是正确的说法。准确地说“每个声明终结器的C ++ / CLI类 都实现IDisposable”。在C ++中,当您delete
受管对象时,将调用其析构函数,然后依次调用其自己的终结器。例如,在C#中,当您调用Dispose()
(显式或通过using
块)时,将调用其终结器,这实际上意味着它实现了IDisposable。如果没有终结器,则无法使用C#之类的语言正确处理该对象。