Udostępnij za pośrednictwem


Jak: tworzenie i używanie wystąpienia unique_ptr

A unique_ptr nie udostępnia jego wskaźnik.Nie można skopiować do innej unique_ptr, przekazywane przez wartość funkcji (chyba że jest modyfikowane przez rvalue), lub w dowolny algorytm standardowy szablon biblioteki (STL), wymagającej kopie mają być dokonane.A unique_ptr mogą być przenoszone tylko.Oznacza to, że własność zasobu pamięci jest przenoszona na nowe unique_ptr i oryginał unique_ptr nie jest właścicielem.Firma Microsoft zaleca, aby ograniczyć obiekt do jednego właściciela, ponieważ wiele własności dodaje złożoności do logiki programu.W związku z tym, użyj inteligentne wskaźnik jest konieczne dla zwykłego obiektu C++, unique_ptr.

Poniższy diagram ilustruje przeniesienia własności między dwoma unique_ptr wystąpień.

Przeniesienie własności unique_ptr

unique_ptrjest zdefiniowany w <memory> nagłówek STL.Dokładnie jest wydajnym jako wskaźnik surowca i mogą być używane w pojemnikach STL.Dodanie unique_ptr wystąpienia do kontenerów STL jest efektywne ponieważ konstruktora move unique_ptr eliminuje potrzebę operacji kopiowania.

Przykład

Następujący przykład przedstawia sposób tworzenia unique_ptr wystąpień i przekazać je między funkcjami.

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

Poniższe przykłady demonstrują to podstawowe cechy z unique_ptr: to może być przeniesiony, ale nie są kopiowane. "Przenoszenie"transfery własności do nowej unique_ptr i resetuje starego unique_ptr.

Następujący przykład przedstawia sposób tworzenia unique_ptr wystąpień i używać ich w obiekcie vector.

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

W for_each pętli, warto zauważyć, że unique_ptr jest przekazywany przez odwołanie w wyrażeniu lambda.Podczas próby przekazania przez wartość w tym polu, kompilator wygeneruje błąd, ponieważ unique_ptr Konstruktor kopiujący jest wyłączone.

Poniższy przykład ilustruje sposób zainicjować unique_ptr oznacza to członek klasy.


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

Zobacz też

Koncepcje

Inteligentne kursory (Podręcznik programowania C++ nowoczesny)