Freigeben über


Gewusst wie: Erstellen und verwenden Sie unique_ptr Instanzen

A unique_ptr teilt seinen Zeiger nicht.Kann nicht in ein anderes kopiert werden unique_ptr, an eine Funktion durch einen Wert übergeben (sei es eine veränderbare Rvalue), oder alle Kopien vorgenommen werden muss (Standard Template Library, STL)-Algorithmus verwendet.A unique_ptr kann nur verschoben werden.Dies bedeutet, dass das Eigentum des Speicher-Ressource auf einen neuen übertragen wird unique_ptr und das Original unique_ptr es nicht mehr besitzt.Es wird empfohlen, ein Objekt auf einen Besitzer zu beschränken, da multiple-Ownership Komplexität die Programmlogik hinzufügt.Wenn Sie einen intelligenten Zeiger für ein einfaches C++-Objekt benötigen, daher können unique_ptr.

Das folgende Diagramm veranschaulicht die Eigentumsübertragung zwischen zwei unique_ptr Instanzen.

Besitz eines unique_ptr verschieben

unique_ptrwird definiert, der <memory> -Header in der STL.Es ist genau das ist effizienter als ein unformatierter Zeiger und können in STL-Containern verwendet werden.Der Zusatz von unique_ptr Instanzen mit STL-Containern ist effizient, da den Konstruktor Verschieben von der unique_ptr entfällt die Notwendigkeit eines Kopiervorgangs.

Beispiel

Das folgende Beispiel veranschaulicht das Erstellen unique_ptr -Instanzen und zwischen Funktionen zu übergeben.

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

Die folgenden Beispiele veranschaulichen dieses grundlegende Merkmal des unique_ptr: Es kann verschoben, aber nicht kopiert. "Moving"überträgt den Besitz auf einen neuen unique_ptr und setzt die alte unique_ptr.

Das folgende Beispiel veranschaulicht das Erstellen unique_ptr -Instanzen und deren Verwendung in einem Vektor.

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

In der for_each -Schleife, und beachten Sie, dass die unique_ptr wird als Verweis im Lambda-Ausdruck übergeben.Wenn Sie versuchen, die hier als Wert übergeben, lösen der Compiler einen Fehler, da die unique_ptr Kopierkonstruktor ist deaktiviert.

Das folgende Beispiel veranschaulicht das Initialisieren einer unique_ptr also einen Klassenmember.


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

Siehe auch

Konzepte

Intelligente Zeiger modernes (C++)