我的程序中发生了一些事情,我无法找到它是否应该发生。如果是的话,我不明白为什么......
以下是代码:
#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”消息之后调用析构函数,但之前,我没有。我认为当向量调整大小时,类的构造函数被调用,但为什么是析构函数?
答案 0 :(得分:17)
在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 no-arg-和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”情况。但是我没有太多机会说“别的时候”,所以我正在接受它。