Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
.png)
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();
}
};