11
#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;
}

该程序将输出:

构造函数:1
析构函数:0
析构函数:-1
析构函数:-2

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

4

3 回答 3

14

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

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

如果您没有显式添加它,编译器会生成一个对 counter 什么都不做的cnt

这个表达

A a1 = f(a0);

正在创建 的副本a0,它使用了复制构造函数。副本的确切数量可能因复制省略而异,但您cnt应该0在程序结束时。

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

于 2012-09-24T14:47:42.723 回答
5

您没有跟踪所有构造函数,只跟踪默认构造函数。编译器生成了一个复制构造函数并使用了几次,其中列出了 2 个对象被列为已销毁而不是已创建。

于 2012-09-24T14:49:26.000 回答
3

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

于 2012-09-24T14:48:09.483 回答