Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针向量_C++ - Fatal编程技术网

C++ 指针向量

C++ 指针向量,c++,C++,我只是想知道指针的向量有什么问题。我的一些朋友建议我使用列表而不是向量。这是否会导致问题: vector<Fruit*> basket; basket.push_back(new Apple()); basket.push_back(new Orange()); vector<Fruit*> temp; temp.push_back(basket[1]); 向量篮; 篮子。推回(新苹果()); 篮子。向后推(新橙色(); 向量温度; 温度推回(篮子[1]); 如果我删

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

vector<Fruit*> basket;
basket.push_back(new Apple());
basket.push_back(new Orange());
vector<Fruit*> temp;
temp.push_back(basket[1]);
向量篮;
篮子。推回(新苹果());
篮子。向后推(新橙色();
向量温度;
温度推回(篮子[1]);

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

如果向量
篮子
临时
被销毁,则
果实
都不会被销毁。使用
new
动态分配的任何内容都必须是
delete
d。当向量超出范围时,它们不会删除其元素指向的对象。如果通过指向另一个向量的一个向量删除对象,则两个向量都指向现在的
delete
d对象

由于向量具有自动存储持续时间,因此绝对不能执行
删除篮或<代码>删除温度

一般不建议使用原始指针,尤其是对于动态分配的存储,您可能会忘记
删除
。然而,在这种情况下,您确实需要由指针提供的多态行为。您应该使用智能指针来避免原始指针的问题。尝试一个
std::vector

如果我删除vector temp,我是否也会破坏篮子[1]对象

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

然而,这不是
向量
的具体问题:使用
列表
不会使您免于此问题。问题在于原始指针。如果希望在指向它的最后一个指针的生命周期结束时自动解除分配指向的对象,则应使用智能指针

根据应用程序需要的所有权策略,您可以在
shared_ptr
unique_ptr
之间进行选择。
shared_ptr
的警告是,应避免引用循环,以防止相互引用的对象彼此保持活动状态。在这方面,您可能需要检查
弱\u ptr

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

序列容器为程序员提供了不同的复杂性权衡,应该相应地使用
向量
数组
是默认情况下应使用的序列容器类型
<当序列中间频繁插入和删除时,应使用代码>列表
转发列表
<当大多数插入和删除发生在序列的开始或结束时,code>deque
是选择的数据结构


basket[1]
只是一个指针,销毁它没有问题。一般来说,指针的问题是,您需要理解
basket[1]
*basket[1]
之间的区别。问:指针的向量有什么问题。答:基本上没什么。C++纯粹主义者可能会畏惧恐怖。但它是完全合法的,而且,依我看,通常是完全恰当的。@paulsm4是正确的,但通常使用得不够理想。介绍对
delete
=sub的需求-optimal@paulsm4为什么会有人畏缩呢。它无处不在:几乎在任何时候,你都必须从一个对象导航到多个对象。还有一条警告,如果你不创建一个带有“new”的对象,那么你就不能尝试“删除”该对象:)指针向量可能最常用于导航。在这种情况下,建议使用原始指针;我见过的智能指针都不能正确处理导航。@JamesKanze在这种情况下可能有用。请注意,在他的示例中,
std::unique_ptr
会产生非常令人惊讶(可能是不想要的)的副作用,在
篮子[1]中留下无效指针
@sftrabbit
shared_ptr
并不一定更好:如果对象也包含对其他对象的
shared_ptr
,则会导致周期风险,如果对象的生命周期由程序逻辑定义(即,应在响应外部事件时删除),则
shared_ptr
将导致更多问题。在某些特定的情况下,
shared\u ptr
是合适的,但是如果事先没有仔细考虑,就不应该使用它。