vector <x *> *与vector <x> * </x> </x *>

时间:2013-09-25 14:32:51

标签: c++ memory memory-management vector

在什么情况下使用会更好:

vector<X*>* vector = new vector<X>();

而不是:

vector<X>* vector = new vector<X>();

有什么优点/缺点?

6 个答案:

答案 0 :(得分:7)

动态分配矢量本身几乎没有充分的理由。除非你做一些非常不寻常的事情,否则不要这样做。

在所有对象具有相同类型的常见情况下,您通常需要一个对象矢量vector<X>

你需要一个指针向量,vector<X*> if

  • X是一个多态基类;和
  • 您希望通过向量访问X的不同子类型的对象;和
  • 您不需要容器来管理对象的生命周期。

如果您希望容器管理异构对象的生命周期,则存储智能指针,例如std::unique_ptr,或使用类似Boost pointer container库的内容。

正如评论中所提到的,如果对象不能或不应该被移动,你也可以考虑一个指针向量:向量将随着它们的增长移动它们的元素,以维持一个连续的数组。在这种情况下,您还应考虑使用稳定的容器,例如dequelist

答案 1 :(得分:1)

与第一种存储指针的情况完全不同,在第二种情况下存储一个值。

当你已经拥有指针时,最好使用指针向量,例如对于在堆上分配的对象(使用new)。 在这种情况下,您甚至可以使用std::unique_ptr

的向量

当你直接拥有对象的值时,最好使用值向量,或者你必须确保对象不被破坏。

我不知道你为什么要动态分配矢量?但正如你在两个案例中所做的那样,那不是问题。

答案 2 :(得分:1)

首选vector<X>,除非你有充分理由不这样做。

如果向量不拥有它正在存储的对象,或者如果您通过某种无法控制的机制获取指针,则应使用

vector<X*>。如果复制或移动对象的成本很高,也可以更高效,但首先对其进行基准测试 - vector<X>将具有更好的参考局部性。它有一个很大的缺点,即破坏向量将删除包含的指针,使其容易出错并且不是异常安全的。使用vector<unique_ptr<X>>来解决最后一个问题。

答案 3 :(得分:0)

你永远不会想要一个指向vector的指针,只需直接使用vector并让它处理内存管理。并且您永远不会想要vector 原始指针,而是使用某种智能指针,例如std::shared_ptr

答案 4 :(得分:0)

在现代C ++中,原始指针有点不流行。特别是,当一个人可以没有间接地在一起做。对于不需要的情况,可以使用智能指针。首先,我不会new向量本身(我认为我没有new直接编辑任何std类型。

您可能想要共享一个向量,然后可能存在一种情况,其中有一个间接到向量的原因,但它看起来像这样:

auto myVec = std::make_shared<std::vector<X>>();
// ^ -- that's an std::shared_ptr<std::vector<X>>

但我想,那不是你的问题。你是在矢量的内容之后。可能有充分的理由对元素进行间接,例如在一些聪明的算法中。但我还建议使用智能指针:

auto myVec = std::make_shared<std::vector<std::shared_ptr<X>>>();
myVec.push_back(std::make_shared<X>(xarg1,xarg2));
myVec.push_back(myVec.back());

在这里,您可以看到向量中的单个项目被跟踪两次。如果你出于某种原因想要这个(这并不像听起来那么疯狂),请使用间接。

答案 5 :(得分:0)

如果要将向量与动态创建的自定义分配器一起使用,则动态创建向量是唯一的选择。

关于X * Mike Seymour给出了一个很好的答案。