指针的向量

smi*_*eil 3 c++

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

vector<Fruit*> basket;
basket.push_back(new Apple());
basket.push_back(new Orange());
vector<Fruit*> temp;
temp.push_back(basket[1]);
Run Code Online (Sandbox Code Playgroud)

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

And*_*owl 6

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

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

但是,这不是一个特定的问题vector:使用list不会使您免于此问题.问题在于原始指针.如果希望在指向它的最后一个指针的生命周期结束时自动释放指向的对象,则应使用智能指针.

根据应用程序所需的所有权策略,您可以在shared_ptr和之间进行选择unique_ptr.需要注意的shared_ptr是,应避免引用循环,以防止相互引用的对象保持彼此存活.您可能想要检查weak_ptr这方面.

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

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