c++ - 当 unique_ptr 在 vector 中时,对 std::unique_ptr<> 拥有的对象的引用/ptr 是否安全?

标签 c++

从表面上看,我喜欢用 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/

相关文章:

c++ - 返回非静态本地对象时,选择复制构造函数而不是 move 构造函数

c++ - 解决 C++ 'target of assignment not really an lvalue' 错误

c++ - 设置类静态

c++ - std::functions 的复合模式

c++ - 蹦床后 Hook 坠毁

c++ - 当构造函数抛出异常并使用自定义 new 时,C++ 如何释放内存

c++ - 将指针分配给迭代器

c++ - 从派生类访问基类公共(public)成员

c++ - OpenCV鱼眼校准C++输出与Python不同

c++ - 定义函数调用中线程访问的全局常量字符串变量