我试图弄清楚如何在 C++/CLI 中正确清理我的对象。
我已经阅读或浏览了这两篇文章(一、二)并查看了标准并查看了其他一些问题,尤其是这篇文章。
我有各种信息:
- 终结器应该清理非托管资源(因此当对象被垃圾收集时,一切都会被清理干净。
- 析构函数应该清理托管资源(删除 Foo 或 Foo.Dispose()?)并调用终结器(根据1)
- 析构函数和终结器都可以多次调用(参见3 p. 26 end of 8.8.8)
- 如果调用了析构函数,则将不再调用终结器(根据1)(不是由 CLR 调用,也就是说,您仍然可以自己调用它)
- 析构函数将调用基类析构函数(见3 p. 25)
- 具有终结器的类应始终具有析构函数(大概是为了确定性地清理非托管资源)
- 对终结器的调用不会调用基类终结器 ( 3 19.13.2 p. 131)
但也有很多混乱,部分原因是
- 终结器在 C# 中称为析构函数
- 析构函数在内部生成 Dispose 和 Finalize 方法(不确定 Finalize),但 Finalize 方法不是终结器
- 析构函数的语义在 C++ 中是不同的,并且通常具有确定性清理和垃圾收集的复杂性
我想要的答案是一个类的示例,该类具有它可能包含的所有不同类型的数据(托管、非托管、托管但一次性,无论您能想到什么)以及正确编写的析构函数和终结器。
我有两个更具体的问题:
bool hasBeenCleanedUp
通过仅拥有一个成员并使析构函数/终结器中的整个代码以此为条件来处理被多次调用的可能性是否可以接受?- 什么样的数据只能被析构函数清理,而不能在终结器中清理,因为它可能已经被 gc 清理了?