C++中析构函数的调用顺序

3

我在主程序中定义了五个用户自定义对象,如下:

它们的析构函数调用顺序是否有特定的顺序?比如说按照如下定义顺序:

Student s1;
Student s2;
Student s3;
Student s4;
Student s5;

s5的析构函数会先被调用还是s1的?

1
我认为你的代码不应该依赖于销毁的顺序(至少出于可读性的原因)。 - Basile Starynkevitch
1
@TonyD,请查看此链接 https://dev59.com/XWPVa4cB1Zd3GeqP9di4。 - jsantander
2个回答

7
析构函数将按照 s5, s4, s3, s2, s1 的顺序被调用。这是一个普遍规律:如果两个对象的生命周期重叠,那么先构造的对象会最后被自动销毁。当然,这并不适用于动态存储期对象,它们不会自动销毁。(例如,使用 new 创建的对象在调用 delete 时被销毁。)

Brian,我爱你哥们。谢谢。 - Tim Southee
你知道,有足够积分的Brian回答问题时,你就知道他的答案是正确的,并且会毫不犹豫地接受。太棒了! :) - Tim Southee
@TimSouthee 谢谢,但是我也会犯很多错误 :) - Brian Bi
如果s1、s2、s3、s4和s5是另一个名为College的类的数据成员,并按照这个顺序依次声明(首先是s1,最后是s5),那么析构函数的调用顺序是什么? - Tim Southee
@TimSouthee,每个人都会犯错,包括我自己。无论如何,规则仍然存在,这在这种情况下是与构造相反的,即类中声明的顺序。 - chris
@chris:我知道,但像你这样的传奇人物回答问题让我们感到很安心,不需要再去核实其有效性。你们真的很棒。 - Tim Southee

3

是的,销毁顺序始终与构造顺序相反。

请查看以下代码。

  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

在你发现如何做的同时,找到为什么要这样做更具有指导意义。 - interesting

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接