Instrukcje: tworzenie i używanie wystąpień unique_ptr
Unique_ptr nie udostępnia wskaźnika. Nie można skopiować go do innego unique_ptr
elementu , przekazanego przez wartość do funkcji lub użytego w dowolnym algorytmie standardowej biblioteki języka C++, który wymaga wykonania kopii. Można unique_ptr
przenieść tylko element . Oznacza to, że własność zasobu pamięci jest przenoszona do innego unique_ptr
, a oryginał unique_ptr
nie jest już jego właścicielem. Zalecamy, aby ograniczyć obiekt do jednego właściciela, ponieważ wiele własności zwiększa złożoność logiki programu. W związku z tym, gdy potrzebujesz inteligentnego wskaźnika dla zwykłego obiektu języka C++, użyj polecenia , a podczas konstruowania elementu użyj unique_ptr
funkcji pomocnika make_unique.unique_ptr
Na poniższym diagramie przedstawiono przeniesienie własności między dwoma unique_ptr
wystąpieniami.
unique_ptr
element jest zdefiniowany w nagłówku w standardowej <memory>
bibliotece języka C++. Jest on dokładnie tak wydajny, jak wskaźnik pierwotny i może być używany w kontenerach biblioteki standardowej języka C++. Dodanie unique_ptr
wystąpień do kontenerów biblioteki standardowej języka C++ jest wydajne, ponieważ konstruktor przenoszenia klasy unique_ptr
eliminuje konieczność wykonania operacji kopiowania.
Przykład 1
W poniższym przykładzie pokazano, jak tworzyć unique_ptr
wystąpienia i przekazywać je między funkcjami.
unique_ptr<Song> SongFactory(const std::wstring& artist, const std::wstring& title)
{
// Implicit move operation into the variable that stores the result.
return make_unique<Song>(artist, title);
}
void MakeSongs()
{
// Create a new unique_ptr with a new object.
auto song = make_unique<Song>(L"Mr. Children", L"Namonaki Uta");
// Use the unique_ptr.
vector<wstring> titles = { song->title };
// Move raw pointer from one unique_ptr to another.
unique_ptr<Song> song2 = std::move(song);
// Obtain unique_ptr from function that returns by value.
auto song3 = SongFactory(L"Michael Jackson", L"Beat It");
}
W tych przykładach przedstawiono tę podstawową cechę unique_ptr
: można ją przenieść, ale nie skopiować. "Przenoszenie" przenosi własność na nową unique_ptr
i resetuje stary unique_ptr
.
Przykład 2
W poniższym przykładzie pokazano, jak tworzyć unique_ptr
wystąpienia i używać ich w wektorze.
void SongVector()
{
vector<unique_ptr<Song>> songs;
// Create a few new unique_ptr<Song> instances
// and add them to vector using implicit move semantics.
songs.push_back(make_unique<Song>(L"B'z", L"Juice"));
songs.push_back(make_unique<Song>(L"Namie Amuro", L"Funky Town"));
songs.push_back(make_unique<Song>(L"Kome Kome Club", L"Kimi ga Iru Dake de"));
songs.push_back(make_unique<Song>(L"Ayumi Hamasaki", L"Poker Face"));
// Pass by const reference when possible to avoid copying.
for (const auto& song : songs)
{
wcout << L"Artist: " << song->artist << L" Title: " << song->title << endl;
}
}
W zakresie pętli zwróć uwagę, że unique_ptr
element jest przekazywany przez odwołanie. Jeśli spróbujesz przekazać wartość według tutaj, kompilator zgłosi błąd, ponieważ unique_ptr
konstruktor kopiujący zostanie usunięty.
Przykład 3
W poniższym przykładzie pokazano, jak zainicjować element unique_ptr
członkowski klasy.
class MyClass
{
private:
// MyClass owns the unique_ptr.
unique_ptr<ClassFactory> factory;
public:
// Initialize by using make_unique with ClassFactory default constructor.
MyClass() : factory (make_unique<ClassFactory>())
{
}
void MakeClass()
{
factory->DoSomething();
}
};
Przykład 4
Za pomocą make_unique można utworzyć unique_ptr
obiekt do tablicy, ale nie można jej użyć make_unique
do zainicjowania elementów tablicy.
// Create a unique_ptr to an array of 5 integers.
auto p = make_unique<int[]>(5);
// Initialize the array.
for (int i = 0; i < 5; ++i)
{
p[i] = i;
wcout << p[i] << endl;
}
Aby uzyskać więcej przykładów, zobacz make_unique.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla