unique_ptr
Klasa
Przechowuje wskaźnik do należącego obiektu lub tablicy. Obiekt/tablica nie jest własnością innego unique_ptr
obiektu . Obiekt/tablica jest niszczona, gdy unique_ptr
obiekt zostanie zniszczony.
Składnia
class unique_ptr {
public:
unique_ptr();
unique_ptr(nullptr_t Nptr);
explicit unique_ptr(pointer Ptr);
unique_ptr(pointer Ptr,
typename conditional<is_reference<Del>::value, Del,
typename add_reference<const Del>::type>::type Deleter);
unique_ptr(pointer Ptr,
typename remove_reference<Del>::type&& Deleter);
unique_ptr(unique_ptr&& Right);
template <class T2, Class Del2>
unique_ptr(unique_ptr<T2, Del2>&& Right);
unique_ptr(const unique_ptr& Right) = delete;
unique_ptr& operator=(const unique_ptr& Right) = delete;
};
//Specialization for arrays:
template <class T, class D>
class unique_ptr<T[], D> {
public:
typedef pointer;
typedef T element_type;
typedef D deleter_type;
constexpr unique_ptr() noexcept;
template <class U>
explicit unique_ptr(U p) noexcept;
template <class U>
unique_ptr(U p, see below d) noexcept;
template <class U>
unique_ptr(U p, see below d) noexcept;
unique_ptr(unique_ptr&& u) noexcept;
constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { } template <class U, class E>
unique_ptr(unique_ptr<U, E>&& u) noexcept;
~unique_ptr();
unique_ptr& operator=(unique_ptr&& u) noexcept;
template <class U, class E>
unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
unique_ptr& operator=(nullptr_t) noexcept;
T& operator[](size_t i) const;
pointer get() const noexcept;
deleter_type& get_deleter() noexcept;
const deleter_type& get_deleter() const noexcept;
explicit operator bool() const noexcept;
pointer release() noexcept;
void reset(pointer p = pointer()) noexcept;
void reset(nullptr_t = nullptr) noexcept;
template <class U>
void reset(U p) noexcept = delete;
void swap(unique_ptr& u) noexcept; // disable copy from lvalue unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;
};
Parametry
Right
Klasa unique_ptr
.
Nptr
std::nullptr_t
Typ rvalue
.
Ptr
Klasa pointer
.
Deleter
deleter
Funkcja powiązana z elementem unique_ptr
.
Wyjątki
Żadne wyjątki nie są generowane przez program unique_ptr
.
Uwagi
Klasa unique_ptr
zastępuje auto_ptr
klasę i może być używana jako element kontenerów biblioteki standardowej języka C++.
make_unique
Użyj funkcji pomocnika, aby efektywnie tworzyć nowe wystąpienia programu unique_ptr
.
unique_ptr
unikatowo zarządza zasobem. Każdy unique_ptr
obiekt przechowuje wskaźnik do obiektu, którego jest właścicielem lub przechowuje wskaźnik o wartości null. Zasób może być własnością nie więcej niż jednego unique_ptr
obiektu; gdy unique_ptr
obiekt będący właścicielem określonego zasobu zostanie zniszczony, zasób zostanie zwolniony. Obiekt unique_ptr
może zostać przeniesiony, ale nie skopiowany. Aby uzyskać więcej informacji, zobacz Rvalue Reference Deklarator: &&
.
Zasób jest zwalniany przez wywołanie przechowywanego deleter
obiektu typu Del
, który wie, jak zasoby są przydzielane dla określonego unique_ptr
elementu . Domyślnie deleter
default_delete<T>
zakłada się, że zasób wskazywany przez ptr
element jest przydzielany za pomocą new
elementu i że można go zwolnić przez wywołanie metody delete _Ptr
. (Częściowa specjalizacja unique_ptr<T[]>
zarządza obiektami tablicy przydzielonymi za pomocą new[]
, i ma domyślną deleter
default_delete<T[]>
, wyspecjalizowaną do wywoływania delete[] ptr
).
Przechowywany wskaźnik do zasobu należącego do niego ma stored_ptr
typ pointer
. Jest Del::pointer
to wartość zdefiniowana, a T *
jeśli nie. deleter
Przechowywany obiekt stored_deleter
nie zajmuje miejsca w obiekcie, jeśli deleter
obiekt jest bezstanowy. Należy pamiętać, że Del
może to być typ odwołania.
Elementy członkowskie
Konstruktory
Nazwa/nazwisko | opis |
---|---|
unique_ptr |
Istnieje siedem konstruktorów dla programu unique_ptr . |
Typedefs
Nazwa/nazwisko | opis |
---|---|
deleter_type |
Synonim parametru Del szablonu . |
element_type |
Synonim parametru T szablonu . |
pointer |
Synonim , jeśli Del::pointer jest zdefiniowany, w przeciwnym razie T * . |
Funkcje
Nazwa/nazwisko | opis |
---|---|
get |
Zwraca wartość stored_ptr . |
get_deleter |
Zwraca odwołanie do stored_deleter . |
release |
pointer() przechowuje i stored_ptr zwraca poprzednią zawartość. |
reset |
Zwalnia aktualnie posiadany zasób i akceptuje nowy zasób. |
swap |
Wymienia zasób i deleter z podanym unique_ptr elementem . |
Operatory
Nazwa/nazwisko | opis |
---|---|
operator bool |
Operator zwraca wartość typu, który jest konwertowany na bool wartość . Wynikiem konwersji na bool jest , gdy get() != pointer() , w przeciwnym razie false true . |
operator-> |
Funkcja składowa zwraca wartość stored_ptr . |
operator* |
Funkcja składowa zwraca wartość *stored_ptr . |
operator= |
Przypisuje wartość unique_ptr elementu (lub ) pointer-type do bieżącego unique_ptr elementu . |
deleter_type
Typ jest synonimem parametru Del
szablonu .
typedef Del deleter_type;
Uwagi
Typ jest synonimem parametru Del
szablonu .
element_type
Typ jest synonimem parametru Type
szablonu .
typedef Type element_type;
Uwagi
Typ jest synonimem parametru Ty
szablonu .
get
Zwraca wartość stored_ptr
.
pointer get() const;
Uwagi
Funkcja składowa zwraca wartość stored_ptr
.
get_deleter
Zwraca odwołanie do stored_deleter
.
Del& get_deleter();
const Del& get_deleter() const;
Uwagi
Funkcja składowa zwraca odwołanie do stored_deleter
elementu .
operator=
Przypisuje adres podanego unique_ptr
do bieżącego.
unique_ptr& operator=(unique_ptr&& right);
template <class U, Class Del2>
unique_ptr& operator=(unique_ptr<Type, Del>&& right);
unique_ptr& operator=(pointer-type);
Parametry
Odwołanie unique_ptr
użyte do przypisania wartości do bieżącego unique_ptr
elementu .
Uwagi
Funkcje składowe wywołają metodę reset(right.release())
i przeniosą się right.stored_deleter
do stored_deleter
metody , a następnie zwracają wartość *this
.
pointer
Synonim , jeśli Del::pointer
jest zdefiniowany, w przeciwnym razie Type *
.
typedef T1 pointer;
Uwagi
Typ jest synonimem , Del::pointer
jeśli jest zdefiniowany, w przeciwnym razie Type *
.
release
Zwalnia własność zwróconego wskaźnika przechowywanego do obiektu wywołującego i ustawia wartość przechowywanego wskaźnika na nullptr
.
pointer release();
Uwagi
Użyj release
polecenia , aby przejąć własność nieprzetworzonego wskaźnika przechowywanego przez element unique_ptr
. Obiekt wywołujący jest odpowiedzialny za usunięcie zwróconego wskaźnika. Właściwość unique-ptr
jest ustawiona na pusty stan skonstruowany domyślnie. Możesz przypisać kolejny wskaźnik zgodnego typu do unique_ptr
elementu po wywołaniu metody release
.
Przykład
W tym przykładzie pokazano, jak obiekt wywołujący wydanie jest odpowiedzialny za zwrócony obiekt:
// stl_release_unique.cpp
// Compile by using: cl /W4 /EHsc stl_release_unique.cpp
#include <iostream>
#include <memory>
struct Sample {
int content_;
Sample(int content) : content_(content) {
std::cout << "Constructing Sample(" << content_ << ")" << std::endl;
}
~Sample() {
std::cout << "Deleting Sample(" << content_ << ")" << std::endl;
}
};
void ReleaseUniquePointer() {
// Use make_unique function when possible.
auto up1 = std::make_unique<Sample>(3);
auto up2 = std::make_unique<Sample>(42);
// Take over ownership from the unique_ptr up2 by using release
auto ptr = up2.release();
if (up2) {
// This statement does not execute, because up2 is empty.
std::cout << "up2 is not empty." << std::endl;
}
// We are now responsible for deletion of ptr.
delete ptr;
// up1 deletes its stored pointer when it goes out of scope.
}
int main() {
ReleaseUniquePointer();
}
Constructing Sample(3)
Constructing Sample(42)
Deleting Sample(42)
Deleting Sample(3)
reset
Przejmuje własność parametru wskaźnika, a następnie usuwa oryginalny przechowywany wskaźnik. Jeśli nowy wskaźnik jest taki sam jak oryginalny przechowywany wskaźnik, reset
usuwa wskaźnik i ustawia przechowywany wskaźnik na nullptr
.
void reset(pointer ptr = pointer());
void reset(nullptr_t ptr);
Parametry
ptr
Wskaźnik do zasobu do przejęcia własności.
Uwagi
Użyj reset
polecenia , aby zmienić przechowywane przez pointer
unique_ptr
element do ptr , a następnie usunąć oryginalny przechowywany wskaźnik. Jeśli element unique_ptr
nie był pusty, reset
wywołuje funkcję deleter zwracaną przez get_deleter
element w oryginalnym przechowywanym wskaźniku.
Ponieważ reset
najpierw przechowuje nowy wskaźnik ptr
, a następnie usuwa oryginalny przechowywany wskaźnik, można reset
go natychmiast usunąć ptr
, jeśli jest on taki sam jak oryginalny przechowywany wskaźnik.
swap
Wymienia wskaźniki między dwoma unique_ptr
obiektami.
void swap(unique_ptr& right);
Parametry
right
Element unique_ptr
używany do zamiany wskaźników.
Uwagi
Funkcja składowa zamienia się stored_ptr
elementami right.stored_ptr
i stored_deleter
na right.stored_deleter
.
unique_ptr
Istnieje siedem konstruktorów dla programu unique_ptr
.
unique_ptr();
unique_ptr(nullptr_t);
explicit unique_ptr(pointer ptr);
unique_ptr(
Type* ptr,
typename conditional<
is_reference<Del>::value,
Del,
typename add_reference<const Del>::type>::type _Deleter);
unique_ptr(pointer ptr, typename remove_reference<Del>::type&& _Deleter);
unique_ptr(unique_ptr&& right);
template <class Ty2, Class Del2>
unique_ptr(unique_ptr<Ty2, Del2>&& right);
Parametry
ptr
Wskaźnik do zasobu, który ma zostać przypisany do klasy unique_ptr
.
_Deleter
Element do deleter
przypisania do .unique_ptr
right
Element rvalue reference
do obiektu unique_ptr
, z którego unique_ptr
pola są przenoszone do nowo skonstruowanego unique_ptr
obiektu .
Uwagi
Dwa pierwsze konstruktory skonstruuje obiekt, który nie zarządza żadnym zasobem. Trzeci konstruktor przechowuje ptr w pliku stored_ptr
. Czwarty konstruktor przechowuje w elementach ptr
stored_ptr
i deleter
w .stored_deleter
Piąty konstruktor przechowuje ptr
i stored_ptr
przenosi deleter
się do .stored_deleter
Szósty i siódmy konstruktor przechowuje right.release()
i przenosi się right.get_deleter()
do klasy stored_deleter
stored_ptr
.
~unique_ptr
Destruktor for unique_ptr
, niszczy unique_ptr
obiekt.
~unique_ptr();
Uwagi
Destruktor wywołuje metodę get_deleter()(stored_ptr)
.