0

私はstd::vectorofを持っunique_ptrており、それらのオブジェクトのライフサイクルを管理してくれることをうれしく思います。

ただし、便宜上、これらのオブジェクトへの他のポインターを格納する必要があります。unique_ptr何かを削除すると、他のポインターがぶら下がることを私は知っています。しかし、私はunique_ptrそれらを取得する前後のこれらのポインターの有効性についてもっと心配しています。

私は常にそれ自体newの中でvia を作成するとは限りませんunique_ptr。たとえばnew Something、関数パラメーターとして渡す場合があります。この場合、unique_ptrmoveそのポインターを関数内で自分自身に使用しています。

しかしnew Something、関数に渡す前にunique_ptr.

オブジェクトが に割り当てられると、unique_ptrを介してそのオブジェクトへのポインタを取得できますget()。しかし、元のポインターが a への割り当ての前に作成された場合、get()このポインターは最初に取得したポインターと同じ場所を指していると常に想定できますか?newunique_ptr

私の仮定ははいです。vectorサイズが変更されて再割り当てされたunique_ptrとしても、メモリ内のオブジェクトへの他のポインタと同様に同じままです。

4

2 に答える 2

0

はい、 aは a をstd::unique_ptr<T>保持しpointer to T、初期化とその後の取得の間で値を変更しませんget()

a の一般的な使用法はunique_ptr、動的に割り当てられた「サブオブジェクト」の 1 つの「親」オブジェクトの所有権を、次と同様の方法で割り当てることです。

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がポリモーフィックな基本型である場合やB、 のオプション/null 許容サブオブジェクトを作成する場合などに適している場合がありAます。

unique_ptrこの所有関係を管理するために生のポインタを使用する利点は、Asデストラクタで自動的に破棄され、A の一部として構造を自動的に移動し、代入を移動することです。

いつものように、どちらの場合も、サブオブジェクトへの生のポインターの有効期間が、所有するオブジェクトの有効期間によって囲まれていることに注意する必要があります。

于 2013-05-17T03:24:59.790 に答える
-3

unique_ptrはい、オブジェクトをコピーしないため、正しいです。したがって、同じアドレスを指す必要があります。ただし、所有する へのポインターを指定するunique_ptrと、その生のポインターをそれ以上使用しないでunique_ptrください。おそらくshared_ptrあなたの状況により良いでしょう。

于 2013-05-17T03:24:44.070 に答える