[英]std::vector and Constructors
std::vector 在创建它包含的 object 的新实例时调用哪个构造函数? 我的印象是它调用了一个默认构造函数,但是如果一个没有定义或者编译器为我做这件事怎么办?
特别是在这样的情况下:
class Foo
{
public:
Foo(int size)
{
data = new double[size];
}
~Foo()
{
delete[] data;
}
private:
double* data;
};
std::vector<Foo> myVector;
Foo bar(5);
myVector.push_back(bar);
//stuff
当 object 在构建之前的大小未知时,它如何知道要分配多少 memory?
至少,要编译std::vector<T>
, T
必须是可复制构造和可复制赋值的。 如果要使用std::vector<T>::vector(int)
(或std::vector<T>::resize()
),则T
必须是可默认构造的。 如果不满足这些要求中的任何一个,则代码将无法编译。
...
C++03 标准,第 23.1 节(一般讨论容器):
这些组件中存储的对象类型必须满足
CopyConstructible
类型 (20.1.3) 的要求,以及Assignable
类型的附加要求。
第 20.1.4 节:
20.1.4 默认构造
默认构造函数不是必需的。 某些容器 class 成员 function 签名将默认构造函数指定为默认参数。 如果使用默认参数 (8.3.6) 调用其中一个签名,则
T()
应是定义明确的表达式 (8.5)。
修复错误后会发生什么:
std::vector<Foo> myVector;
myVector.reserve(10);
myVector.push_back(bar);
是你有两个Foo
实例指向同一个data
缓冲区。 它可能会工作一段时间,但最终两个对象都被销毁,析构函数被调用两次(或更多,取决于vector
是否需要移动其内容)并且缓冲区被双重释放,导致未定义的行为(这通常意味着崩溃)。
为了解决vector
的初始内容,它复制构造您作为参数传入的模式(此参数默认为默认构造的 object,但并非必须如此):
std::vector<Foo> myVector(10, bar); // 10 copies of bar
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.