0

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

我有一个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
    ...
}

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

4

2 回答 2

3

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

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

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

于 2013-03-18T14:34:03.770 回答
2

*point有类型Point,没有Point*

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

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

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

于 2013-03-18T14:34:00.990 回答