C++ 在添加到唯一的\u ptr之前和之后,指针是否应该相同?

C++ 在添加到唯一的\u ptr之前和之后,指针是否应该相同?,c++,pointers,unique-ptr,C++,Pointers,Unique Ptr,我有一个std::vector的unique_ptrs,我很高兴让他们管理这些对象的生命周期 但是,为了方便起见,我需要存储指向这些对象的其他指针。我知道,一旦unique\u ptr删除某些内容,其他指针就会悬空。但是我更关心那些指针在unique\u ptr获取它们之前和之后的有效性 我并不总是通过unique\u ptr本身中的new创建,例如,我可能会将new Something作为函数参数传递,在这种情况下,unique\u ptr使用将该指针上的移动到函数内部的自身中 但我也可以在将

我有一个
std::vector
unique_ptr
s,我很高兴让他们管理这些对象的生命周期

但是,为了方便起见,我需要存储指向这些对象的其他指针。我知道,一旦
unique\u ptr
删除某些内容,其他指针就会悬空。但是我更关心那些指针在
unique\u ptr
获取它们之前和之后的有效性

我并不总是通过
unique\u ptr
本身中的
new
创建,例如,我可能会将
new Something
作为函数参数传递,在这种情况下,
unique\u ptr
使用
将该指针上的
移动到函数内部的自身中

但我也可以在将新事物传递到函数中,然后为其分配一个
唯一的\u ptr
之前,对其执行
操作

将对象分配给
唯一\u ptr
后,我可以通过
get()
获取指向该对象的指针。但是如果原始指针是在分配给
unique\u ptr
之前创建的,那么我是否可以始终假定此
get()
指针指向最初通过
new
获得的指针所在的位置


我的假设是肯定的,即使
向量
调整大小并重新分配,
唯一的\u ptr
以及指向内存中对象的任何其他指针都保持不变。

是的,您是正确的,因为
唯一的\u ptr
不会复制对象;因此,它必须指向同一地址。但是,一旦您给自己一个
unique\u ptr
指针,就不应该再使用该原始指针,因为
unique\u ptr
可能会被销毁并释放内存,并将原始指针变成悬空指针。也许
shared\u ptr
更适合您的情况。

是的,
std::unique\u ptr
持有一个指向T的
指针,它不会改变初始化和以后使用
get()检索之间的值。

unique\u ptr
的一个常见用法是以与以下类似的方式为动态分配的“子对象”分配一个“父”对象所有权:

struct A
{
    B b;
}

int main()
{
    A a = ...;
    B* p = &a.b;
}
在上面的
b
a
的真正子对象

将此与:

struct A
{
    unique_ptr<B> b = new B(...);
}

int main()
{
    A a = ...;
    B* p = a.b.get();
}
结构A { 唯一的b=新的b(…); } int main() { A=。。。; B*p=a.B.get(); }
在上面的
A
(*b)
与第一个示例有类似的关系,除了这里
b
对象是在堆上分配的。在这两种情况下,A的析构函数都将销毁“子对象”。这种“堆上”子对象结构在某些情况下可能更可取,例如,因为
B
是多态基类型,或者使
B
成为
a
的可选/可为空的子对象

使用
unique_ptr
而不是原始指针来管理此所有权关系的优点是,它将在
中作为
析构函数自动销毁它,并将自动移动构造并将其作为


通常,在这两种情况下,您必须小心,指向子对象的任何原始指针的生存期都包含在所属对象的生存期内。

计算机代码越多,文本越不人性化。:)我所理解的是你们在分享指针。似乎最好使用
std::shared\u ptr
@MarkGarcia valid point来完成,但我仍然很好奇普通的C风格指针是如何以这种方式与std智能指针交互的
unique\u ptr
不会改变它所拥有的指针。正如其他人提到的那样。您想做的事情的描述听起来很像是,它可能会破坏为对象提供一个
唯一的\u ptr
。@MarkGarcia有多个指针指向一个对象和有多个拥有指针之间的区别。如果有一个普通的非所有权指针是没有意义的,那么
unique\u ptr
就不会有
get()
函数。-1:如果不能有其他非所有权指针或对其内容的引用,unique\u ptr将是无用的。@DeadMG这个名字不意味着它应该是指向某个内容的唯一指针吗?或者,
唯一的
部分是否意味着它只是指向某个对象的唯一指针?当然,不用说,只要你确信
唯一的ptr
没有被破坏(在本例中从
向量中删除),你就可以随意使用指针,但我没有得到这个问题的印象。@SethCarnegie:这是OP第二段的第一句话。你怎么会错过的?@Nicolas错过了什么?我说OP可以做什么,我认为他不应该做什么,我认为他应该做什么。@SethCarnegie:你说“我没有感觉到这个问题就是关于这个问题的。”第二段的第一句话是“但是为了方便起见,我需要存储指向这些对象的其他指针。”“其他指针”是这里的关键短语。