![]() |
1
39
1)行业或学术界使用的“析构函数”和“终结器”之间是否有明确的区别? 当然有。区别似乎在于析构函数是确定地调用的清理方法,而终结器在垃圾收集器告诉它们时运行。 2)在这种情况下,C规范出错了——终结器在C中称为“析构函数”。为什么C规范的作者把它弄错了? 我不知道,但我能猜到。事实上,我有两个猜测。 猜测1是1999年5月12日没有一篇维基百科文章清楚地描述了这两个概念之间的细微差别。那是因为没有维基百科。还记得没有维基百科的时候吗?黑暗时代,伙计。错误可能只是一个诚实的错误,相信这两个术语是相同的。 我只知道这两个术语 是 1999年5月12日相同,定义上的差异后来才演变,因为很明显,迫切需要和懒惰的清理方法之间存在消除歧义的必要性。 猜测2是1999年5月12日,语言设计委员会希望开放“析构函数”可以作为某种东西实现的可能性。 其他 而不是定稿器。也就是说,“析构函数”被设计成一个C语言概念,它不一定与.NET“终结器”概念一一对应。在设计一种语言的同时,它所处的框架也在设计中,有时您希望将自己与子系统中最新的设计变更隔离开来。 语言委员会1999年5月12日的说明部分内容如下:
所以,你现在知道了我对这个问题的一切。如果你想了解更多,下次见到安德斯时再问问他。 |
![]() |
2
6
严格地说,C没有析构函数(我相信C规范在这一点上很混乱)。
C的终结器看起来像C++析构函数,但是,正如你所说,是非确定性的。
C具有确定性清理形式
C++/CLI具有确定性析构函数,它看起来像C++析构函数。在cli级别,这些映射到
C++/CLI使用C语言用于终结器的析构函数相同的语法可能有点混乱,但它更适合C++,它具有确定性破坏的强大传统。 不幸的是,这些术语缺乏普遍的定义,这意味着你总是需要澄清你在说什么。我个人总是用这个词 终结器 当谈到C概念和储备时 析构函数 对于明确意味着确定性破坏的上下文。 [更新] 自从我在这里的原始帖子,埃里克·利珀特已经发布了他的回复(接受的答案),并跟进了 blog post 同样。我很高兴看到我们达成一致意见:-) |
![]() |
3
4
我相信“析构函数”是C代码,“终结器”是编译后的CIL方法。C编译器将析构函数转换为终结器。 编辑:为了更详细,C语言规范将“析构函数”定义为类上的C实例方法。那么,析构函数是C语法的一部分——析构函数是出现在源代码中的语言对象。
“终结器”是公共语言运行库中使用的术语,例如在对
或者更简洁地说, 析构函数 是为了 终结器 作为 源代码 是为了 机器代码 ;) |
![]() |
4
3
如果我们遵守析构函数的“确定性”定义,那么我会说在.NET对象中没有析构函数,除非使用 the IDisposable interface . |
![]() |
Arnish Grover · 为什么这里两次调用析构函数?[副本] 7 年前 |
![]() |
hvertous · 在析构函数方法中引发异常 7 年前 |
![]() |
Phi Truong · 链表析构函数C++ 7 年前 |
![]() |
allo · C++程序挂起在向量析构函数中 7 年前 |
|
user8185371 · 释放对象的内存与终止内务管理? 7 年前 |
![]() |
Peter Hwang · 销毁列表结构的全局数组 7 年前 |