为什么我的析构函数似乎比构造函数更频繁地被调用?

时间:2012-09-24 14:45:56

标签: c++ constructor

#include<iostream>
using namespace std;

class A{
public:
    static int cnt;
    A()
    { 
        ++cnt; 
        cout<<"constructor:"<<cnt<<endl;
    }
    ~A()
    {
        --cnt;
        cout<<"destructor:"<<cnt<<endl;
    }
};

int A::cnt = 0;

A f(A x){
    return x;
}
int main(){
    A a0;
    A a1 = f(a0);
    return 0;
}

程序将输出:

constructor:1
destructor:0
destructor:-1
destructor:-2

构造函数和析构函数不成对出现?

3 个答案:

答案 0 :(得分:14)

您需要添加一个增加计数器的复制构造函数。

A(const A&)
{ 
    ++cnt; 
    cout<<"copy constructor:"<<cnt<<endl;
}

如果不明确添加,编译器会生成一个对计数器cnt不起作用的编译器。

此表达式

A a1 = f(a0);

正在创建a0的副本,它们使用了复制构造函数。确切的份数可能会因copy elision而异,但您的cnt应该在计划结束时为0

注意:在C ++ 11中,您还应该考虑编译器生成移动复制构造函数的可能性,但是,一旦声明了自己的复制构造函数,编译器不再生成移动版本。

答案 1 :(得分:5)

您没有跟踪所有构造函数,只跟踪默认构造函数。编译器生成了一个复制构造函数并使用了它几次,考虑了被列为已销毁但未创建的2个对象。

答案 2 :(得分:3)

您还需要计算复制构造函数调用。在C ++ 11中,还需要考虑移动构造函数。