【问题标题】:How to cast vector<T>::iterator (on the heap) as shared_ptr<T>如何将vector<T>::iterator(在堆上)转换为shared_ptr<T>
【发布时间】:2013-03-06 22:27:23
【问题描述】:

恐怕这个领域的每个现有问题/答案似乎都有细微的不同:

我有一个使用迭代器循环的 shared_ptr&lt;vector&lt;Point&gt;&gt; profile。我想在循环外保留一个 shared_ptr&lt;Point&gt; 用于各种目的,但我在语法上苦苦挣扎。请您给点建议?

这是一个基本的例子:

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

注意我想使用指向Point 的普通引用/指针会很简单,但我试图避免这种情况,尤其是在涉及堆时。我也意识到在这种情况下我可以使用索引,但这在容器类之间的可转移性较差。

【问题讨论】:

    标签: c++ boost iterator shared-ptr


    【解决方案1】:

    如果你想安全地绕过shared_ptr&lt;Point&gt;,你需要的是shared_ptr&lt;vector&lt;shared_ptr&lt;Point&gt;&gt;&gt;

    您遇到的问题是,如果您的 shared_ptr&lt;vector&lt;Point&gt;&gt; 超出范围,则从 vector 的成员构造的任何 shared_ptr&lt;Point&gt; 都将指向无效内存。

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

    【讨论】:

    • 谢谢。在向量本身超出范围之前,shared_ptr 是否不存在?
    • 好的,我会注意的。感谢您的建议。
    • 通过为其中一个元素创建 shared_ptr 来尝试释放向量内存的观点是一个很好的观点。谢谢!
    【解决方案2】:

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

    但是即使您获取了该地址(通过&amp;*point),您也无法为其创建shared_ptr,因为对象的生命周期具有自动存储,它不能(也不需要)由shared_ptr

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

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

    【讨论】:

    • +1 shared_ptr&lt;vector&gt;&gt; - 正要查询这个!
    • 是的,你们都是对的。这是一个矫枉过正,我会删除它!
    猜你喜欢
    • 2019-10-20
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2016-03-31
    • 2014-03-24
    相关资源
    最近更新 更多