3

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

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

如果我删除向量 temp,我是否也销毁了 basket[1] 对象?如果没有,使用指针向量有什么问题?

4

2 回答 2

6

如果我删除向量 temp,我是否也销毁了 basket[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是当大多数插入和删除发生在序列的开头或结尾时选择的数据结构。

于 2013-02-21T17:27:59.130 回答
3

如果任何一个向量baskettemp被破坏,则没有一个Fruits 被破坏。任何动态分配的东西都new必须是deleted。当向量超出范围时,它们不会delete指向其元素所指向的对象。如果您delete通过一个向量指向另一个向量的对象,则两者都指向现在的deleted 对象。

由于您的向量具有自动存储期限,因此您绝对不能这样做delete basket;or delete temp;

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

于 2013-02-21T17:26:32.183 回答