为什么这个程序中的析构函数被调用了两次?

时间:2013-12-28 14:07:38

标签: c++ destructor

是的我知道这个问题已经被问过很多次并且我已经尝试了解之前的帖子(并且相信我已经尝试过了)但是我真的无法理解这个概念。

在下面的程序中,创建了A类数组a,并为数组中的每个相应元素调用了默认构造函数四次。这部分我得到了。 指针p被赋予类对象数组a。我想p现在指向数组中的第一个元素。 现在这就是我迷路的地方。析构函数被调用4次。我已经阅读了很多解释,但它们似乎只是让我更加困惑。我真的只想简单解释为什么会这样。

我很抱歉,如果再次问这个是令人恼火的(虽然我确定我不会是最后一次)但是那些愿意的人会非常感激。

我的程序加上输出:

#include <iostream.h>
  class A
  {
  public:
      A(int i)
      {  a=i;  }
      A()
      {
         a=0;
         cout<<"Default constructor called."<<a<<endl;
     }
     ~A()
     {  cout<<"Destructor called."<<a<<endl;  }
     void Print()
     {  cout<<a<<endl;  }
 private:
     int a;
 };
 void main()
 {
     A a[4],*p;
     int n=1; 
     p=a;
     for(int i=0;i<4;i++)
         a[i]=A(++n);
     for(i=0;i<4;i++)
          (p+i)->Print();
 }

输出:

 Default constructor called. 0
 Default constructor called. 0
 Default constructor called. 0
 Default constructor called. 0
 Destructor called. 2
 Destructor called. 3
 Destructor called. 4
 Destructor called. 5
 2
 3
 4
 5
  Destructor called. 5
  Destructor called. 4
  Destructor called. 3
  Destructor called. 2

2 个答案:

答案 0 :(得分:2)

A(++n)创建一个临时对象,在创建后不久就会自动销毁。这解释了第一批析构函数调用。

答案 1 :(得分:2)

代码的评论版:

void main()
{
    A a[4]; // Create 4 A : 4 calls to A().
    A* p;
    int n = 1; 
    p = a;
    for (int i = 0; i < 4; i++) {
        ++n;
        a[i] = A(n); // construct temporary A(n); call A(n), assign it into a[i]
                     // then call ~A();
    }
    for (int i = 0; i < 4; i++)
         (p + i)->Print();
 } // A a[4] goes out of scope and so call ~A() in reverse order.