C ++中的析构函数调用顺序[重复]
Posted
技术标签:
【中文标题】C ++中的析构函数调用顺序[重复]【英文标题】:Order of destructor calls in C++ [duplicate] 【发布时间】:2015-04-21 05:11:20 【问题描述】:我的主目录中有五个用户定义的对象,如下所示:
它们的析构函数被调用是否有任何特定的顺序?就像说定义的顺序如下:
Student s1;
Student s2;
Student s3;
Student s4;
Student s5;
是先调用 s5 的析构函数还是先调用 s1 的析构函数?
【问题讨论】:
我相信你的代码不应该依赖于销毁的顺序(至少出于可读性的原因) @TonyD,然后看到这个***.com/questions/10595283/…。 【参考方案1】:将按照s5
、s4
、s3
、s2
、s1
的顺序调用析构函数。这是一个通用规则:如果两个对象的生命周期重叠,那么第一个被构造的对象将是最后一个被自动销毁的对象。当然,这不适用于动态存储持续时间的对象,它们不会自动销毁。 (例如, 使用 new
创建的对象在您调用 delete
时会被销毁。)
【讨论】:
布莱恩,我爱你。谢谢。 你知道,有趣的是,当有人像 Brian 一样多分回答一个问题时,你会知道这是正确的答案并认为这是理所当然的。惊人的! :) @TimSouthee 谢谢,但我也犯了很多错误 :) 如果 s1、s2、s3、s4 和 s5 是其他名为College
的类的数据成员,并且它们按该顺序声明(首先是 s1,最后是 s5)怎么办?那么析构函数调用呢?
@TimSouthee,每个人都会犯错,当然包括我自己。无论如何,规则成立,它仍然与构造相反,在这种情况下,它是类中的声明顺序。【参考方案2】:
是的,破坏的顺序总是与构建的顺序相反。
请看下面的代码。
class Base
public:
Base ( )
cout << "Inside Base constructor" << endl;
~Base ( )
cout << "Inside Base destructor" << endl;
;
class Derived : public Base
public:
Derived ( )
cout << "Inside Derived constructor" << endl;
~Derived ( )
cout << "Inside Derived destructor" << endl;
;
void main( )
Derived x;
如果您运行此代码,您将获得以下输出。
Inside Base constructor
Inside Derived constructor
Inside Derived destructor
Inside Base destructor
【讨论】:
以上是关于C ++中的析构函数调用顺序[重复]的主要内容,如果未能解决你的问题,请参考以下文章