2013-03-18 120 views
0

恐怕在这个领域的每个存在的问题/答案似乎是微妙的不同:如何为shared_ptr的矢量投:: <T>迭代器(上堆)<T>

我有一个shared_ptr<vector<Point>> profile它使用迭代器循环。我想为了各种目的在循环外部保留一个shared_ptr<Point>,但是我在语法上挣扎。请你指教?

这里是一个基本的例子:

shared_ptr<Point> peak; 
for (vector<Point>::iterator point=profile->begin(); point!=profile->end(); point++) 
{ 
    ... 
    peak = shared_ptr<Point>(*point); // fails 
    ... 
} 

N.B.我想使用一个简单的参考/指针Point会很简单,但我试图避免这种情况,尤其是涉及堆时。我也意识到,在这种情况下我可以使用索引,但这在容器类之间传递的可能性较小。

回答

3

你需要的是shared_ptr<vector<shared_ptr<Point>>>,如果你想安全地绕过shared_ptr<Point>

你的问题是,如果你的shared_ptr<vector<Point>>超出范围,从vector成员构成任何shared_ptr<Point>将指向无效记忆。

另一方面,如果您新创建的shared_ptr<Point>超出了范围,那么您将试图释放由vector管理的内存,这不是一件好事!

+0

谢谢。请问shared_ptr 不存在,直到向量本身超出范围? – mosi 2013-03-18 14:50:28

+0

我不得不查看代码的其余部分以查看范围。 – Nick 2013-03-18 15:56:20

+0

好的,我会保重的。感谢您的建议。 – mosi 2013-03-19 12:03:23

2

*point具有类型Point而不是Point*

但是,即使你把其中的地址(通过&*point)你不能为它创建一个shared_ptr因为对象的生命周期具有自动存储,它不能(也不需要)由shared_ptr进行管理。

只要原始矢量没有被修改,获取对象内的对象(或者实际上是一个原始指针)是安全的。然而,修改矢量可能会移动其元素,并且对它们的引用将变为无效。

最后我想知道为什么你的载体被包裹在shared_ptr。这很少有道理。你确定你需要这个吗?

+0

+1''shared_ptr >' - 刚要查询这个! – Nick 2013-03-18 14:37:54

+0

是的,你是对的。这是一个矫枉过正的事情,我会删除它! – mosi 2013-03-18 14:47:59

相关问题