【发布时间】:2013-11-07 05:06:26
【问题描述】:
我正在尝试弄清楚如何在 C++/CLI 中正确清理我的对象。
我已经阅读或浏览了这两篇文章(one、two)并查看了the standard 并查看了其他一些问题,尤其是this one。
我有各种信息:
- 终结器应清理非托管资源(因此当对象被垃圾回收时,所有内容都会被清理干净。
- 析构函数应该清理托管资源(删除 Foo 或 Foo.Dispose()?)并调用终结器(根据 1)
- 析构函数和终结器都可以被多次调用(参见3 p. 26 end of 8.8.8)
- 如果析构函数被调用,终结器将不再被调用(根据1)(不是由CLR,也就是说,你仍然可以自己调用它)
- 析构函数将调用基类析构函数(参见 3 第 25 页)
- 具有终结器的类应始终具有析构函数(可能是为了确定性地清理非托管资源)
- 对终结器的调用不会调用基类终结器 (3 19.13.2 p. 131)
但也有很多混乱,部分原因是
- 终结器在 C# 中称为析构函数
- 析构函数在内部生成 Dispose 和 Finalize 方法(不确定 Finalize),但 Finalize 方法不是终结器
- C++ 中析构函数的语义不同 以及总体上同时进行确定性清理和垃圾收集的复杂性
我想要的答案是一个类的示例,该类具有它可能包含的所有不同类型的数据(托管、非托管、托管但一次性,无论您能想到什么)以及正确编写的析构函数和终结器。
我有两个更具体的问题:
- 是否可以通过仅使用
bool hasBeenCleanedUp成员并以此为条件在析构函数/终结器中设置整个代码来处理被多次调用的可能性? - 哪些数据只能被析构函数清理,而不能在终结器中清理,因为它可能已经被 gc 清理了?
【问题讨论】:
-
如果您给出不同类型数据的示例,并向我们展示您的尝试,您将获得更好的响应,然后我们可以提供反馈。跨度>
标签: c++-cli destructor finalizer