在对valgrind进行了大量研究之后,我得出结论: std::vector创建了您想要push_back的对象的副本。
这是真的吗?如果没有副本,向量就不能保留对象的引用或指针?!
谢谢
发布于 2010-02-17 01:57:46
是的,std::vector<T>::push_back()
会创建参数的副本并将其存储在向量中。如果要在矢量中存储指向对象的指针,请创建一个std::vector<whatever*>
而不是std::vector<whatever>
。
但是,您需要确保指针引用的对象仍然有效,而向量持有对它们的引用(智能指针利用RAII习惯用法解决了这个问题)。
发布于 2010-02-17 01:57:13
vector总是复制存储在向量中的任何内容。
如果您保留了一个指针向量,那么它将复制指针,但不会复制指针所指向的实例。如果你正在处理大对象,你可以(也许应该)总是使用一个指针向量。通常,出于安全目的,使用适当类型的智能指针向量是很好的,否则处理对象生存期和内存管理可能会很棘手。
发布于 2010-02-17 02:01:08
不仅std::vector会对您所推回的内容进行复制,而且集合的定义也会声明它会这样做,而且如果向量中没有正确的复制语义,就不能使用对象。因此,例如,您不能在向量中使用auto_ptr。
https://stackoverflow.com/questions/2275076
复制相似问题