Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przechowuje wskaźnik do należącego obiektu lub tablicy. Obiekt/tablica nie jest własnością innego unique_ptrobiektu . 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_tTyp 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_ptrklasę 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_ptrelementu . Domyślnie deleter default_delete<T> zakłada się, że zasób wskazywany przez ptr element jest przydzielany za pomocą newelementu 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 Delszablonu . |
element_type |
Synonim parametru Tszablonu . |
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_ptrelementem . |
Operatory
| Nazwa/nazwisko | opis |
|---|---|
operator bool |
Operator zwraca wartość typu, który jest konwertowany na boolwartość . Wynikiem konwersji na bool jest , gdy get() != pointer(), w przeciwnym razie falsetrue . |
operator-> |
Funkcja składowa zwraca wartość stored_ptr. |
operator* |
Funkcja składowa zwraca wartość *stored_ptr. |
operator= |
Przypisuje wartość unique_ptr elementu (lub ) pointer-typedo bieżącego unique_ptrelementu . |
deleter_type
Typ jest synonimem parametru Delszablonu .
typedef Del deleter_type;
Uwagi
Typ jest synonimem parametru Delszablonu .
element_type
Typ jest synonimem parametru Typeszablonu .
typedef Type element_type;
Uwagi
Typ jest synonimem parametru Tyszablonu .
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_deleterelementu .
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_ptrelementu .
Uwagi
Funkcje składowe wywołają metodę reset(right.release()) i przeniosą się right.stored_deleter do stored_deletermetody , 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_ptrobiektu .
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_deleterstored_ptr .
~unique_ptr
Destruktor for unique_ptr, niszczy unique_ptr obiekt.
~unique_ptr();
Uwagi
Destruktor wywołuje metodę get_deleter()(stored_ptr).