我只是想知道指针向量有什么问题。我的一些朋友建议我使用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]对象?如果没有,使用指针向量有什么问题?
答案 0 :(得分:6)
如果我删除矢量temp,我也会破坏篮子[1]对象吗?
否即可。首先,你不能删除 temp
;相反,它会在超出范围时被销毁。当发生这种情况时,向量元素指向的对象将不会自动delete
d。
但是,这不是vector
的具体问题:使用list
无法避免此问题。问题在于原始指针。如果你希望在指向它的最后一个指针的生命周期结束时自动释放指向的对象,你应该使用智能指针。
根据您的应用所需的所有权政策,您可以选择shared_ptr
和unique_ptr
。与shared_ptr
的警告是应避免引用循环,以防止相互引用的对象保持彼此活着。您可能希望在这方面检查weak_ptr
。
最后,除非您有充分理由不使用vector
,否则vector
应该是容器的默认选择。来自C ++ 11标准的第23.2.3 / 2段:
序列容器为程序员提供了不同的复杂权衡,应该相应地使用。
vector
或array
是默认情况下应使用的序列容器类型。当序列中间频繁插入和删除时,应使用list
或forward_list
。当大多数插入和删除发生在序列的开头或结尾时,deque
是首选的数据结构。
答案 1 :(得分:3)
如果任何一个向量basket
或temp
被破坏,Fruit
s中的任何一个都不会被销毁。使用new
动态分配的任何内容都必须为delete
d。当向量超出范围时,它们不会delete
其元素指向的对象。如果你通过另一个向量中指向的向量delete
一个对象,则都指向现在的delete
d对象。
由于您的向量具有自动存储持续时间,因此您绝对不得执行delete basket;
或delete temp;
。
一般不建议使用原始指针,尤其是动态分配的存储,您可能会忘记delete
。但是,在这种情况下, do 需要多态行为,这是由指针提供的。您应该使用智能指针来避免原始指针的问题。试试std::vector<std::shared_ptr<Fruit>>
。