从C ++中的析构函数中恢复对象?

MathuSum Mut:

免责声明:我知道这是一个糟糕的设计,我只是出于好奇而提出这个问题,以便尝试获得有关析构函数在C ++中如何工作的更深入的知识。

在C#中,可以编写:GC.KeepAlive(this)在类的析构函数中(请参见下面的编辑),这意味着即使在析构函数调用完成之后,该对象在内存中仍将保持活动状态。

C ++的设计是否允许类似于上述C#算法从析构函数中恢复对象?

编辑:如下面的答案所指出,GC.ReRegisterForFinalize()与问题更紧密相关GC.KeepAlive(this)

Sam Varshavchik:

最简洁的答案是不。C ++不采用Java或C#之类的垃圾回收。当一个对象被销毁时,它会立即被销毁。一去不复返了。加入了看不见的合唱团。固定在峡湾等...

并用不同的语言多次说这句话,这样就不可能轻易地重新解释...

析构函数作为对象销毁的一部分被调用。对象销毁包括调用析构函数并重新分配用于对象本身的内存。这是一个单一的过程,而不是两个单独的过程。在析构函数运行时,该对象仍然存在,可供析构函数使用,但在借用的时间存在。这是一个定论,那就是一旦析构函数返回,对象将被蒸发。一旦调用了析构函数,该对象将被销毁,并且没有任何改变其命运的事情。

理解这一点:之所以调用析构函数,是因为:要么:该对象最初是在堆上分配的,但使用的是“ new”,而现在正在“删除”该对象。“删除”是指“删除”,而不是“可能删除”。因此该对象将被删除。或者,如果对象是在堆栈上分配的,则执行线程会退出作用域,因此作用域中声明的所有对象都将被销毁。从技术上讲,析构函数是由于对象被破坏而被调用的。因此,物体被破坏了。结束。

话虽如此,C ++允许您为类实现自定义分配器。如果您愿意,可以编写自己的自定义内存分配和释放函数,以实现所需的任何功能。尽管这些从未用于堆栈分配的对象(即局部变量)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章