在对valgrind进行了大量研究之后,我得出结论,std::vector会生成一个你想要推回的对象的副本。

这是真的吗?vector不能在没有副本的情况下保留对象的引用或指针?!

谢谢


当前回答

std::vector不仅会复制您要推回的任何内容,而且集合的定义也声明了它将这样做,并且您不能在vector中使用没有正确复制语义的对象。例如,你不能在向量中使用auto_ptr。

其他回答

为什么要进行大量的调查才发现这一点! 用一些简单的代码证明一下就可以了。

std::vector<std::string> vec;

{
      std::string obj("hello world");
      vec.push_pack(obj);
}

std::cout << vec[0] << std::endl;  

如果打印"hello world",则该对象必须已被复制

是的,std::vector存储副本。vector如何知道对象的预期生命周期是什么?

如果你想要转移或共享对象的所有权,可以使用指针,可能是像shared_ptr这样的智能指针(在Boost或TR1中找到)来简化资源管理。

vector总是复制vector中存储的内容。

如果你保存了一个指针向量,那么它会复制指针,但不会复制指针所指向的实例。如果你在处理大型对象,你可以(也许应该)总是使用指针向量。通常,使用适当类型的智能指针向量有利于安全,否则处理对象生命周期和内存管理可能会很棘手。

是的,std::vector<T>::push_back()创建参数的副本并将其存储在vector中。如果你想在向量中存储指向对象的指针,创建std::vector<whatever*>而不是std::vector<whatever>。

但是,您需要确保指针引用的对象在vector保存对它们的引用时仍然有效(利用RAII习惯用法的智能指针解决了这个问题)。

std::vector不仅会复制您要推回的任何内容,而且集合的定义也声明了它将这样做,并且您不能在vector中使用没有正确复制语义的对象。例如,你不能在向量中使用auto_ptr。