C++ 为什么我的析构函数似乎比构造函数调用得更频繁? #包括 使用名称空间std; 甲级{ 公众: 静态int-cnt; () { ++碳纳米管; cout

C++ 为什么我的析构函数似乎比构造函数调用得更频繁? #包括 使用名称空间std; 甲级{ 公众: 静态int-cnt; () { ++碳纳米管; cout,c++,constructor,C++,Constructor,您需要添加一个增加计数器的复制构造函数 constructor:1 destructor:0 destructor:-1 destructor:-2 正在创建使用复制构造函数的a0的副本。副本的确切数量可能会因具体情况而有所不同,但在程序结束时,您的cnt应为0 >强>注< >:在C++ 11中,还应该考虑编译器生成的移动复制构造函数的可能性,但是,一旦声明了自己的复制构造函数,编译器就不再生成移动版本。 也需要对复制构造函数调用进行计数。在C++ 11中还有需要移动的构造函数。nto帐户。

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

constructor:1 destructor:0 destructor:-1 destructor:-2 正在创建使用复制构造函数的
a0
的副本。副本的确切数量可能会因具体情况而有所不同,但在程序结束时,您的
cnt
应为
0


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

也需要对复制构造函数调用进行计数。在C++ 11中还有需要移动的构造函数。nto帐户。

您没有跟踪所有的构造函数,只跟踪默认构造函数。编译器生成了一个副本构造函数并多次使用它,说明了列出为已销毁和未创建的两个对象。

欢迎使用Stack Overflow!+1,感谢您提供完整的示例程序。查看这一点的重要性。由
return x;
调用的复制构造函数显然已经优化过了,但我想知道,当调用
f
时,一个足够激进的优化器是否可以删除该调用(
x
按值传递)同样。因此,实际上您只调用一次默认析构函数,然后调用一次复制构造函数。@FrerichRaabe:这种优化不符合标准,只允许在某些情况下省略复制构造函数。在所有允许的情况下,省略的副本的源或目标都是临时的。@SteveJessop:我明白了,谢谢你的澄清。 constructor:1 destructor:0 destructor:-1 destructor:-2
A(const A&)
{ 
    ++cnt; 
    cout<<"copy constructor:"<<cnt<<endl;
}
A a1 = f(a0);