繁体   English   中英

当 unique_ptr 在向量中时,对 std::unique_ptr<> owned object 的引用/ptr 是否安全?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM