次の方法で共有


方法: unique_ptr インスタンスを作成して使用する

A unique_ptrのポインターを共有しません。それをコピーできませんunique_ptr、(右辺値の変更がない限り) 値を関数に渡し、またはコピーを行う必要があります任意の標準テンプレート ライブラリ (STL) アルゴリズムに使用します。A unique_ptrのみに移動することができます。メモリ リソースの所有権が新規に転送されることを意味unique_ptr 、元unique_ptrが所有しています。複数の所有権をプログラムのロジックに複雑のため 1 人の所有者には、オブジェクトを制限することをお勧めします。そのため、標準 C++ オブジェクトをスマート ポインターが必要な場合を使用してunique_ptr

次の図は、2 間の所有権の転送を示していますunique_ptrインスタンス。

unique_ptr の所有権の移動

unique_ptr定義されている、 <memory>では、STL ヘッダー。正確には、生ポインターとして効率的では、STL コンテナーで使用できます。unique_ptr STL コンテナーへのインスタンスは効率的なので、移動コンス トラクターのunique_ptrコピーの操作は必要ありません。

使用例

次の使用例を作成する方法を示していますunique_ptrをインスタンス化し、それらの間の関数に渡します。

unique_ptr<Song> SongFactory(std::wstring artist, std::wstring title)
{
    // Implicit move operation into the variable that stores the result.
    return unique_ptr<Song>(new Song(artist, title));
}

void MakeSongs()
{
    // Create a new unique_ptr with a new object.
    unique_ptr<Song> pSong = unique_ptr<Song>(new Song(L"Mr. Children", L"Namonaki Uta"));

    // Use the unique_ptr
    vector<wstring> titles;
    titles.push_back(pSong->title);

    // Move raw pointer from one unique_ptr to another.
    unique_ptr<Song> pSong2 = std::move(pSong);

    // Obtain unique_ptr from function that returns rvalue reference.
    auto pSong3 = SongFactory(L"Michael Jackson", L"Beat It");
}

この基本的な特性のこれらの例を示しますunique_ptr: 移動しますが、コピーされません。"移動"転送の所有権を新しいunique_ptrと、以前のリセットunique_ptr

次の使用例を作成する方法を示していますunique_ptrとのそれらのベクトルを使用します。

void SongVector()
{
    vector<unique_ptr<Song>> v;

    // Create a few new unique_ptr<Song> instances
    // and add them to vector using implicit move semantics.
    v.push_back(unique_ptr<Song>(new Song(L"B'z", L"Juice")));
    v.push_back(unique_ptr<Song>(new Song(L"Namie Amuro", L"Funky Town")));
    v.push_back(unique_ptr<Song>(new Song(L"Kome Kome Club", L"Kimi ga Iru Dake de")));
    v.push_back(unique_ptr<Song>(new Song(L"Ayumi Hamasaki", L"Poker Face")));

    // Pass by reference to lambda body. 
    for_each(v.begin(), v.end(), [] (const unique_ptr<Song>& p)
    {
        wcout << L"Artist: " << p->artist << L"Title: " << p->title << endl; 
    });        
}

for_eachループ、ことに注意してください、 unique_ptrラムダ式内の参照によって渡されます。ここで値を渡すしようとした場合、コンパイラ、エラーはスローされます、 unique_ptrコピー コンス トラクターを無効にします。

初期化する方法を次に示します、 unique_ptrクラスのメンバーです。


class MyClass
{
private:
    // MyClass owns the unique_ptr.
    unique_ptr<ClassFactory> factory;
public:

    // Initialize by invoking the unique_ptr move constructor.
    MyClass() : factory ( unique_ptr<ClassFactory>(new ClassFactory()))
    {              

    }

    void MakeClass()
    {
        factory->DoSomething();
    }
};

参照

概念

スマート ポインター (Modern C++)