我担心这个领域的每个现有问题/答案似乎都略有不同:
我有一个使用迭代器循环的 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
就足够了,但我试图避免这种情况,特别是涉及到堆时。我也意识到在这种情况下我可以使用索引,但这在容器类之间不太可以转移。
答案 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
中。这很少有意义。你确定需要这个吗?