如何将vector <t> :: iterator(在堆上)转换为shared_ptr <t> </t> </t>

时间:2013-03-18 14:31:14

标签: c++ boost iterator shared-ptr

我担心这个领域的每个现有问题/答案似乎都略有不同:

我有一个使用迭代器循环的 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就足够了,但我试图避免这种情况,特别是涉及到堆时。我也意识到在这种情况下我可以使用索引,但这在容器类之间不太可以转移。

2 个答案:

答案 0 :(得分:3)

如果你想安全地传递shared_ptr<vector<shared_ptr<Point>>>

,你需要的是shared_ptr<Point>

您遇到的问题是,如果您的shared_ptr<vector<Point>>超出范围,则shared_ptr<Point>成员构建的任何vector都将指向无效的内存。

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

答案 1 :(得分:2)

*point的类型为Point,而不是Point*

但即使你拿了那个地址(通过&*point),也无法为它创建shared_ptr因为对象的生命周期有自动存储,所以它不能(并且不需要)由shared_ptr管理。

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

最后,我想知道为什么你的矢量被包裹在shared_ptr中。这很少有意义。你确定需要这个吗?