首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中从析构函数恢复对象?

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

Stack Overflow用户
提问于 2016-02-17 21:25:51
回答 6查看 5K关注 0票数 48

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

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

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

编辑:正如下面的答案所指出的,GC.ReRegisterForFinalize()与这个问题的关系比GC.KeepAlive(this)更密切。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-02-17 21:27:26

简短的答案是:不。C++不像Java或C#那样使用垃圾收集。当一个对象被销毁时,它会立即被销毁。一去不复返。加入了隐形唱诗班。对峡湾的渴望,等等。

用不同的词重复几次,这样就不会有任何可能的重新解释……

析构函数作为对象销毁的一部分被调用。对象销毁包括调用析构函数和释放用于对象本身的内存。这是一个单独的进程,而不是两个独立的进程。当析构函数运行时,对象仍然存在,供析构函数使用,但它是在借用的时间内存在的。一旦析构函数返回,这个对象就会被汽化,这已成定局。一旦调用析构函数,对象就会被销毁,没有什么能改变它的命运。

理解这一点:调用析构函数的原因是:对象最初是用"new“分配在堆上的,现在是"delete"d。"delete”意味着"delete",而不是"delete maybe“。所以这个对象正在被删除。或者,如果对象是在堆栈上分配的,则执行线程退出作用域,因此作用域中声明的所有对象都将被销毁。从技术上讲,析构函数是由于对象被销毁而被调用的。所以,这个物体正在被销毁。结束了。

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

票数 103
EN

Stack Overflow用户

发布于 2016-02-17 21:35:20

您实际上误解了GC.KeepAlive在.NET中的作用,不能在对象的析构函数中使用它来防止对象被析构--实际上,GC.KeepAlive()是空的,没有实现。请参阅.NET源代码here

它确保作为参数传递的对象在调用GC.KeepAlive之前不会被垃圾回收。在调用GC.KeepAlive之后,可以立即对作为参数传递给KeepAlive的对象进行垃圾回收。由于KeepAlive没有实际的实现,这完全是基于这样一个事实:编译器必须维护对要作为参数传递给KeepAlive的对象的引用。也可以使用将对象作为参数的任何其他函数(不是由编译器或运行时内联的)。

票数 55
EN

Stack Overflow用户

发布于 2016-02-18 00:51:30

这是一个想法:

代码语言:javascript
复制
C* gPhoenix= nullptr;

C::~C ()
{
gPhoenix= new C (*this);  // note: loses any further-derived class ("slice")
}

现在,如果涉及到的对象(基类或成员)确实有执行某些操作的析构函数,那么如果你使用delete gPhoenix;就会遇到问题,所以你需要更复杂的机制,这取决于它真正想要完成的是什么。但是你没有任何真正的目标,只是好奇的探索,所以指出这一点就足够了。

当析构函数的主体被调用时,对象仍然是完好的。当你在析构函数中进行普通的成员函数调用时,它看起来非常重要和正常。

拥有该对象的内存将被回收,因此您不能停留在原地。在离开身体后,其他的破坏会自动发生,不能被干扰。但是,您可以在此之前复制对象。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35457998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档