为什么在初始化和调整对象向量大小时调用析构函数
Why is the destructor called when initializing and resizing a vector of objects?
我的程序中发生了一些事情,我找不到它是否应该发生。如果是的话,我不明白为什么…
代码如下:
#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"消息之后调用,而在"END"消息之前调用。我认为,当矢量调整大小时,类的构造函数被调用,但为什么是析构函数?
在c++ 03中,vector<A>::resize()
有一个默认参数,默认值为A()
。这是暂时的,被摧毁了。vector的元素由其复制构造。
这在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"大小写。但是我没有多少机会说"else while",所以我就用它。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 如何在使用向量调整大小时调用非默认构造函数
- vector.resize()方法在调整大小时调用默认的元素构造函数
- 在c++中调整vector大小时调用一次类构造函数
- 为什么在初始化和调整对象向量大小时调用析构函数