[英]Is having a reference/ptr to std::unique_ptr<> owned object safe when the unique_ptr is in a vector?
从表面上看,我喜欢使用unique_ptr
的容器来拥有数据的模式。 我的问题是,如果我知道unique_ptr
不会从 scope 中获取 go,那么对这样一个拥有的 object 的成员进行指针/引用是否安全?
例如我可能有
auto v = std::vector<std::unique_ptr<ClassWithFooMember>>{};
v.emplace_back(std::make_unique<ClassWithFooMember>());
我可以安全地做吗
auto *foo_ptr = &(v.at(0)->foo);
如果我知道v
将比foo_ptr
并且v
永远不会删除任何项目?
如果向v
添加了很多项或者如果v
的内部表示发生了变化,会发生什么情况? ClassWithFooMember
实例的 memory 布局会改变吗?
谢谢你。
由于“在”此类vector
中的ClassWithFooMember
对象是单独分配的,因此只要(匿名) ClassWithFooMember
object 存在,无论对v
进行任何操作,您的foo_ptr
(或指向整个ClassWithFooMember
对象的指针)都将保持有效。 例如,对v
进行排序或使其重新分配是无害的。 v.erase(v.begin())
当然会破坏它,但即使那样你也可能先写了
auto p=std::move(v.front());
auto *q=v.front().release();
这将使 object 在完全销毁v
后继续存在。
无论容器类型如何,这一切都是正确的; 这是额外的 memory 和用于单独分配的时间开销所支付的收益。 它也不是特定于std::unique_ptr
的(尽管出于其他原因,这通常是一个不错的选择); std::vector<T*>
将具有相同的行为,包括保留T*
(或指向T
的指针)而不是引用vector
元素的T*&
(或T**
)是安全的本身。 (在你的情况下相应的不安全的事情是持有一个std::unique_ptr<ClassWithFooMember>&
或std::unique_ptr<ClassWithFooMember>*
,你通常不应该这样做。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.