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

use*_*746 11 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;
}
Run Code Online (Sandbox Code Playgroud)

该程序将输出:

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

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

jua*_*nza 14

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

A(const A&)
{ 
    ++cnt; 
    cout<<"copy constructor:"<<cnt<<endl;
}
Run Code Online (Sandbox Code Playgroud)

如果不显式添加它,编译器将生成一个不对计数器执行任何操作的程序cnt.

这个表达

A a1 = f(a0);
Run Code Online (Sandbox Code Playgroud)

正在创建a0使用复制构造函数的副本.确切的份数可能因复制省略而异,但您cnt应该0在程序的最后.

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


Dav*_*eas 5

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