在我的程序中发生了一些事情,我找不到它是否应该发生。如果是这样,我不明白为什么..。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
class A{
public:
A();
~A();
};
A::A(){
cout << "creating" << endl;
}
A::~A(){
cout << "deleting" << endl;
}
int main(void){
vector<vector<A > > vec;
vec.resize(5);
for(int i = 0; i < 5; ++i){
vec[i].resize(5);
}
cout << "END" << endl;
return 0;
}下面是输出:
creating
deleting
creating
deleting
creating
deleting
creating
deleting
creating
deleting
END
deleting
deleting
[..more deleting here]我理解为什么析构函数在"END“消息之后被调用,但在此之前,我不理解。我认为当向量调整大小时,类的构造函数会被调用,但为什么是析构函数?
发布于 2013-01-17 02:14:21
在C++03中,vector<A>::resize()有一个默认参数,其默认值为A()。就是这个暂时的东西被破坏了。向量的元素是从它复制构造的。
这在C++11中是“固定的”,其中有两个resize重载。一个只有一个参数,值初始化任何额外的元素。另一个有两个参数,从提供的值复制初始化每个额外的元素。在C++11中,此程序具有以下行为:
creating
creating
creating
<repeated for a total of 25 "creating"s>
creating
creating
creating
END
deleting
deleting
deleting
<repeated for a total of 25 "deleting"s>
deleting
deleting
deleting在C++03中,如果一个A实例的构建成本非常高,以至于有必要将其数量最小化,那么您可以将其从5个无参数+ 25个复制构造减少到1个无参数和25个复制构造,如下所示:
A default_value;
for (int i = 0; i < 5; ++i) {
// same end result as vec[i].resize(5)
if (vec[i].size() >= 5) {
vec[i].erase(vec.begin() + 5, vec.end());
} else while(vec[i].size() < 5) {
vec[i].push_back(default_value);
}
}您可能会以稍微不同的方式编写它,显然,对于您的示例代码,您不需要"if“大小写。但是我没有太多的机会说“其他时候”,所以我抓住了机会。
https://stackoverflow.com/questions/14364937
复制相似问题