指针在添加到unique_ptr之前和之后是否应该相同
Should a pointer be the same before and after adding to a unique_ptr?
我有一个std::vector
和unique_ptr
s,我很高兴让他们管理这些对象的生命周期。
但是,为了方便起见,我需要存储指向这些对象的其他指针。我知道一旦unique_ptr
删除了一些东西,其他指针就会挂起。但我更关心的是unique_ptr
获取指针前后指针的有效性。
我并不总是在unique_ptr
本身中通过new
创建,例如,我可能会将new Something
作为函数参数传递,在这种情况下,unique_ptr
在该指针上使用move
,使其在函数内部。
但在我将其传递给一个函数之前,我也可能是new Something
,然后该函数为它分配了一个unique_ptr
。
一旦一个对象被分配给unique_ptr
,我就可以通过get()
获得指向它的指针。但是,如果原始指针是在分配给unique_ptr
之前创建的,那么我可以一直假设这个get()
指针指向与最初通过new
获得的指针相同的位置吗?
我的假设是肯定的,即使vector
调整大小并重新分配,unique_ptr
以及指向内存中对象的任何其他指针也保持不变。
是的,std::unique_ptr<T>
包含pointer to T
,并且在初始化和稍后使用get()
检索之间不会更改值
unique_ptr
的一个常见用途是分配一个动态分配的"子对象"的"父"对象所有权,类似于:
struct A
{
B b;
}
int main()
{
A a = ...;
B* p = &a.b;
}
CCD_ 23是CCD_。
将其与进行比较
struct A
{
unique_ptr<B> b = new B(...);
}
int main()
{
A a = ...;
B* p = a.b.get();
}
在上面的A
和(*b)
具有与第一示例类似的关系,除了这里B
对象被分配在堆上。在这两种情况下,A的析构函数都会破坏"子对象"。在某些情况下,这种"堆上"子对象结构可能更可取,例如,因为B
是多态基类型,或者使B
成为A
的可选/可为null的子对象。
与原始指针相比,使用unique_ptr
来管理这种所有权关系的优势在于,它将在As
析构函数中自动销毁它,并且它将自动移动构造并将其作为a.的一部分进行移动分配
通常,在这两种情况下,都必须小心,指向子对象的任何原始指针的生存期都包含在所属对象的生存期内。
是的,您是正确的,因为unique_ptr
没有复制对象;因此,它必须指向相同的地址。然而,一旦您给了一个指向unique_ptr
的指针来拥有它,就不应该再使用该原始指针了,因为unique_ptr
可能会被破坏并释放内存,并将原始指针变成一个悬空指针。也许shared_ptr
会更适合你的情况。
- 即使在超出范围之后,我是否可以保留矢量数据
- 在C++"new"运算符之后使用"realloc"是否安全?
- 我怎么知道“ rehash”是否在插入unordered_map之后发生
- 移动变量是否有效,可以在 std::move 之后使用
- 链接列表中最后一项之后的项目是否为0
- C 是否允许在变异模板参数之后进行普通参数
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- 对于QProcess,是否需要在waitForFinished之后调用waitForReadyRead
- progam在std :: getline AM之后停止响应,代码中是否存在错误
- C++ istream:gcount() 是否总是在 read() 之后设置,即使它失败了
- 如何判断 WIN32 C++ 应用程序在 CTRL-ALT-DEL 之后是否失去了焦点
- 如果我对async_read进行两次调用,那么只有在处理完第一次调用之后,才会处理第二次调用,这是否安全
- 在 std::move 之后重复使用 std 容器是否安全
- 对对象的数据成员的shared_ptr是否使数据成员在对象的生存期之后保持活动状态
- 默认参数之后的可变参数格式是否正确
- 是否可以保证在用括号括起来的块之后不会清洁堆栈?
- omp 关键部分之后是否有隐式障碍
- 在计算函数返回值之前或之后是否销毁了局部变量
- 如果我在 for 中声明一个对象,它的内存是否会在那之后被释放?
- 如何比较字符串以查看在"$"之前输入的字符是否等于它之后的字符?