[英]std::vector, constructors, objects
下列构造函数
std::vector<Object> objects(n);
创建n个调用默认构造函数的对象,即类似这样的对象:
std::vector <Object> objects;
for (unsigned int i = 0; i < n; i++) objects.push_back(o);
此过程对动态分配的对象也有效吗? 请问施工
std::vector<Object *> objects(n);
代表这个功能?
std::vector <Object*> objects;
for (unsigned int i = 0; i < n; i++) objects.push_back(new Object());
如果没有,有没有办法安排它?
std::vector<Object> objects(n);
其行为取决于您的标准库实现实现的C ++ Standard版本:
在C ++ 03中,这将创建一个默认的构造Object
,然后复制该对象n次。
在C ++ 0x中,此默认值构造n个Object
。
区别通常并不重要,但是很高兴知道。
std::vector<Object *> objects(n);
这将创建一个vector
其中包含n个null Object*
。 由于Object*
不是类类型并且没有构造函数,因此将对新插入的对象进行值初始化,这对于指针来说意味着将它们设置为NULL
。
如果要动态创建新对象,然后将指向它们的指针存储在容器中,则需要自己调用new
。 请注意,如果容器拥有指向对象,则不应将原始指针存储在标准库容器中。 这样做也不例外。
您应该改为使用诸如shared_ptr
或unique_ptr
类的智能指针(注意:由于auto_ptr
智能指针由于其不寻常的复制语义而无法存储在容器中,因此应使用shared_ptr
或unique_ptr
)。
无论如何,要将指向n个不同的,动态分配的对象的指针插入到容器中,您需要调用new
n次来创建这n个对象。 您的for
循环解决方案没有任何问题。
下列构造函数
std::vector<Object> objects(n);
创建n个调用默认构造函数的对象
是的,但是默认构造函数仅用于构造vector
的构造函数的第二个可选参数,通过复制此参数来构造vector
中的n
对象。 [C ++ 03答案]
如果您做了类似的事情:
std::vector<Object*> objects(n, new Object());
您将动态分配一个对象,并在vector
具有指向该对象的n
指针,这可能不是您想要的。
如果指针容器应该拥有动态分配的对象,那么使用指针容器几乎总是一个坏主意。 您应该考虑使用boost::ptr_vector
类的东西,或者,如果不可能的话,可以使用智能指针的容器(尽管不是std::auto_ptr
)。
您的最终代码示例具有正确的总体思路,但请谨慎行事:如果您这样做, vector
将无法为您管理分配! objects.clear()
将泄漏内存。
您可能想使用std::vector<some_smart_ptr<Object> >
,但是选择正确的智能指针类需要注意(例如)将元素从一个向量复制到另一个向量时会发生什么。 boost::shared_ptr
是一个安全的选择,但对于您的用例而言可能会有不必要的开销。 boost::ptr_vector
可能更好。
不, vector
不会自动使用指向Object
实例的指针来创建。 您必须执行您编写的for
循环才能正确填充它。
完成这些对象后,您还需要delete
每个对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.