我想知道为什么矢量模板执行两个分配,只有一个似乎是必要的.
例如:
#include <vector>
#include <iostream>
class A {
public:
A(const A &a) {
std::cout << "Calling copy constructor " << this << " " << &a << "\n";
}
A() {
std::cout << "Calling default constructor " << this << "\n";
}
~A() {
std::cout << "Calling destructor " << this << "\n";
}
};
int main(int argc, char **argv)
{
std::vector <A> Avec;
std::cout << "resize start\n";
Avec.resize(1);
std::cout << "resize end\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
resize start Calling default constructor 0x7fff9a34191f Calling copy constructor 0x1569010 0x7fff9a34191f Calling destructor 0x7fff9a34191f resize end
Tod*_*ner 15
它没有执行两个分配,它是由默认构造函数创建一个对象以传递给resize,然后将该对象复制到新位置,然后破坏参数.
如果查看要调整大小的参数:
void resize(n, t = T())
Run Code Online (Sandbox Code Playgroud)
它有一个默认的参数,一个T类型的默认构造对象(这是在输出中调用的默认构造函数).然后,在函数内,它将其复制到正确的位置(这是复制构造函数).resize函数结束后,销毁参数(输出中的析构函数调用).