从表面上看,我喜欢用 unique_ptr
的容器来拥有数据的模式。我的问题是,如果我知道 unique_ptr
不会超出范围,那么将指针/引用指向此类拥有对象的成员是否安全?
例如我可能有
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
实例的内存布局会改变吗?
谢谢。
最佳答案
自 ClassWithFooMember
“在”这样一个 vector
中的对象分配单独,你的foo_ptr
(或指向整个 ClassWithFooMember
对象的指针)将保持有效,而不管对v
的任何 操作如何只要(匿名)ClassWithFooMember
对象存在。例如,排序 v
或使其重新分配是无害的。 v.erase(v.begin())
当然,会破坏它,但即便如此,您也可能首先编写了以下任一内容
auto p=std::move(v.front());
auto *q=v.front().release();
这会让对象在销毁后继续存在v
完全。
无论容器类型如何,这一切都是正确的;这是用于单独分配的额外内存和时间开销所带来的好处。它也不是特定于 std::unique_ptr
的(尽管出于其他原因,这通常是一个不错的选择); std::vector<T*>
会有相同的行为,包括保留 T*
是安全的(或指针指向 T
)但不是 T*&
(或 T**
)指的是 vector
元素本身。 (在你的情况下相应的不安全是持有 std::unique_ptr<ClassWithFooMember>&
或 std::unique_ptr<ClassWithFooMember>*
,你通常不应该这样做。)
关于c++ - 当 unique_ptr 在 vector 中时,对 std::unique_ptr<> 拥有的对象的引用/ptr 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63248455/