Sdílet prostřednictvím


Jak: vytvoření a použití instance unique_ptr

A unique_ptr nesdílí její ukazatel.Nelze kopírovat do jiného unique_ptr, předána hodnota funkce (Pokud je upravitelná rvalue), nebo v libovolné standardní šablonu knihovny (STL) algoritmus, který vyžaduje kopií, které mají být provedeny.A unique_ptr lze pouze přesunout.To znamená, že vlastnictví prostředků paměti je převedena do nového unique_ptr a původní unique_ptr je již vlastníkem.Doporučujeme omezit objekt jednoho vlastníka, protože vlastnictví více přidá program logiky složitosti.Proto když potřebujete inteligentní ukazatel pro obyčejný objekt jazyka C++, použít unique_ptr.

Následující diagram znázorňuje převodu vlastnictví mezi dvěma unique_ptr instance.

Přesunutí unique_ptr vlastnictví

unique_ptrje definována <memory> hlavičky STL.Je přesně je efektivní jako ukazatel raw a lze je použít v nádobách STL.Přídavek unique_ptr instance STL kontejnerů je efektivní protože konstruktoru přesunout unique_ptr eliminuje potřebu operace kopírování.

Příklad

Následující příklad ukazuje, jak vytvořit unique_ptr instancí a jejich předání funkce.

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");
}

Tyto příklady ukazují tento základní charakteristika unique_ptr: ji lze přesunout, ale nebudou zkopírovány. "Přesunutí"převede vlastnictví na novou unique_ptr a obnoví původní unique_ptr.

Následující příklad ukazuje, jak vytvořit unique_ptr instancí a použít je ve vektoru.

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; 
    });        
}

V for_each smyčka, Všimněte si, že unique_ptr je předána odkazem lambda výraz.Při pokusu o předání hodnotou zde kompilátor bude vyvolána chyba, protože unique_ptr je zakázáno Kopírovat konstruktor.

Následující příklad ukazuje, jak inicializovat unique_ptr je členem třídy.


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();
    }
};

Viz také

Koncepty

Inteligentní ukazatelů (Příručka programování moderních C++)