以下构造函数
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());
如果没有,有没有办法安排呢?
答案 0 :(得分:6)
std::vector<Object> objects(n);
此行为取决于标准库实现实现的C ++标准版本:
在C ++ 03中,这会创建一个默认构造的Object
,然后复制对象n次的构造。
在C ++ 0x中,此默认值构造n Object
s。
差异通常不重要,但知道很好。
std::vector<Object *> objects(n);
这将创建一个vector
,其中包含n个Object*
个。由于Object*
不是类类型且没有构造函数,因此新插入的对象是值初始化的,对于指针,它们意味着它们被设置为NULL
。
如果要动态创建新对象,然后在容器中存储指向它们的指针,则需要自己调用new
。请注意,如果容器拥有指向的对象,则不应将原始指针存储在标准库容器中。这样做并非例外。
您应该使用类似shared_ptr
或unique_ptr
的智能指针(注意:auto_ptr
智能指针由于其不寻常的复制语义而无法存储在容器中,因此{{1应该使用{}}或shared_ptr
。
在任何情况下,要将指向n个不同的动态分配对象的指针插入容器,您需要调用unique_ptr
n次来创建这些n个对象。您的new
循环解决方案没有任何问题。
答案 1 :(得分:2)
以下构造函数
std::vector<Object> objects(n);
创建n个对象,调用默认构造函数
是的,但默认构造函数仅用于构造vector
构造函数的第二个可选参数,向量中的n
个对象是通过复制此参数构造的。 [C ++ 03回答]
如果你做了类似的事情:
std::vector<Object*> objects(n, new Object());
你会动态分配一个对象并在n
中拥有vector
指向该对象的指针,这可能不是你想要的。
如果该容器应该拥有动态分配的对象,那么使用指针容器几乎总是一个坏主意。您应该考虑类似boost::ptr_vector
之类的内容,或者如果不可能使用智能指针容器(不是std::auto_ptr
)。
答案 2 :(得分:0)
您的最终代码示例具有正确的总体思路,但请谨慎行事:如果您这样做,vector
将不为您管理分配!例如,objects.clear()
会泄漏内存。
您可能希望使用std::vector<some_smart_ptr<Object> >
,但选择正确的智能指针类需要注意(例如)将元素从一个向量复制到另一个向量时会发生什么。 boost::shared_ptr
是一个安全的选择,但可能会为您的用例带来不必要的开销。 boost::ptr_vector
可能会更好。
答案 3 :(得分:0)
不,不会使用指向vector
实例的指针自动创建Object
。您必须执行您编写的for
循环才能正确填充它。
完成这些对象后,您还需要delete
这些对象。