0

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

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

我并不总是newunique_ptr自身内部创建 via,例如,我可能会new Something作为函数参数传递,在这种情况下,在函数内部unique_ptr使用move该指针到自身。

但我也可能new Something在将它传递给一个函数之前给它分配一个unique_ptr.

一旦将对象分配给 aunique_ptr我可以通过get(). 但是,如果原始指针是在分配给 a 之前创建的,我是否可以始终假设该get()指针指向与最初通过 via 获得的指针相同的位置?newunique_ptr

我的假设是肯定的,即使vector调整大小和重新分配,unique_ptr以及指向内存中对象的任何其他指针都保持不变。

4

2 回答 2

0

是的, astd::unique_ptr<T>持有 a pointer to T,它不会改变初始化和稍后检索之间的值get()

a 的常见用途unique_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对象是在堆上分配的。在这两种情况下, A 的析构函数都会破坏“子对象”。在某些情况下,这种“堆上”子对象结构可能更可取,例如,因为B它是多态基类型,或者使.BA

使用unique_ptrover 原始指针来管理这种所有权关系的优点是它会在析构函数中自动销毁它As,并且它会自动移动构造并移动分配它作为 A 的一部分。

像往常一样,在这两种情况下,您必须小心,任何指向子对象的原始指针的生命周期都包含在拥有对象的生命周期内。

于 2013-05-17T03:24:59.790 回答
-3

是的,你是对的,因为unique_ptr不复制对象;因此,它必须指向同一个地址。然而,一旦你给了一个指向 a 的指针unique_ptr,你就不应该再使用那个原始指针,因为它unique_ptr可能会被销毁并释放内存,并将你的原始指针变成一个悬空指针。也许shared_ptr对你的情况会更好。

于 2013-05-17T03:24:44.070 回答