指针的向量

时间:2013-02-21 17:23:55

标签: c++

我只是想知道指针向量有什么问题。我的一些朋友建议我使用list而不是vector。这会导致问题:

vector<Fruit*> basket;
basket.push_back(new Apple());
basket.push_back(new Orange());
vector<Fruit*> temp;
temp.push_back(basket[1]);

如果我删除矢量temp,我是否也会破坏篮子[1]对象?如果没有,使用指针向量有什么问题?

2 个答案:

答案 0 :(得分:6)

  

如果我删除矢量temp,我也会破坏篮子[1]对象吗?

即可。首先,你不能删除 temp;相反,它会在超出范围时被销毁。当发生这种情况时,向量元素指向的对象将不会自动delete d。

但是,这不是vector的具体问题:使用list无法避免此问题。问题在于原始指针。如果你希望在指向它的最后一个指针的生命周期结束时自动释放指向的对象,你应该使用智能指针。

根据您的应用所需的所有权政策,您可以选择shared_ptrunique_ptr。与shared_ptr的警告是应避免引用循环,以防止相互引用的对象保持彼此活着。您可能希望在这方面检查weak_ptr

最后,除非您有充分理由使用vector,否则vector应该是容器的默认选择。来自C ++ 11标准的第23.2.3 / 2段:

  

序列容器为程序员提供了不同的复杂权衡,应该相应地使用。 vectorarray是默认情况下应使用的序列容器类型。当序列中间频繁插入和删除时,应使用listforward_list。当大多数插入和删除发生在序列的开头或结尾时,deque是首选的数据结构。

答案 1 :(得分:3)

如果任何一个向量baskettemp被破坏,Fruit s中的任何一个都不会被销毁。使用new动态分配的任何内容都必须为delete d。当向量超出范围时,它们不会delete其元素指向的对象。如果你通过另一个向量中指向的向量delete一个对象,则都指向现在的delete d对象。

由于您的向量具有自动存储持续时间,因此您绝对不得执行delete basket;delete temp;

一般不建议使用原始指针,尤其是动态分配的存储,您可能会忘记delete。但是,在这种情况下, do 需要多态行为,这是由指针提供的。您应该使用智能指针来避免原始指针的问题。试试std::vector<std::shared_ptr<Fruit>>