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】:

将按照s5s4s3s2s1 的顺序调用析构函数。这是一个通用规则:如果两个对象的生命周期重叠,那么第一个被构造的对象将是最后一个被自动销毁的对象。当然,这不适用于动态存储持续时间的对象,它们不会自动销毁。 (例如, 使用 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 ++中的析构函数调用顺序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

11.8 C++构造函数小节

11.8 C++构造函数小节

我们应该在 C 中使用 exit() 吗?

构造函数和析构函数中的虚函数调用[重复]

cpp中的析构函数会自动调用吗?即使析构函数没有提及非动态变量,它们是不是也会被删除?

带有向量的类构造函数中的析构函数调用