Classe unique_ptr
Armazena um ponteiro para um objeto ou matriz possuído. O objeto/matriz não pertence a nenhum outro unique_ptr
. O objeto/matriz é destruído quando unique_ptr
é destruído.
Sintaxe
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;
};
Parâmetros
Right
Um unique_ptr
.
Nptr
Um rvalue
do tipo std::nullptr_t
.
Ptr
Um pointer
.
Deleter
Uma função deleter
que é associada a unique_ptr
.
Exceções
Nenhuma exceção é gerada por unique_ptr
.
Comentários
A classe unique_ptr
substitui auto_ptr
e pode ser usada como um elemento dos contêineres da Biblioteca Padrão C++.
Use a função auxiliar make_unique
para criar de modo eficiente novas instâncias de unique_ptr
.
unique_ptr
gerencia exclusivamente um recurso. Cada objeto unique_ptr
armazena um ponteiro para o objeto que possui ou armazena um ponteiro nulo. Um recurso pode ser propriedade de apenas um objeto unique_ptr
; quando um objeto unique_ptr
que possui um recurso específico é destruído, o recurso é liberado. Um objeto unique_ptr
pode ser movido, mas não copiado; para obter mais informações, consulte Declarador de Referência Rvalue&&
.
O recurso é liberado chamando um objeto deleter
armazenado do tipo Del
que sabe como os recursos são alocados para um determinado unique_ptr
. O padrão deleter
default_delete<T>
pressupõe que o recurso apontado por ptr
seja alocado com new
, e que ele possa ser liberado chamando delete _Ptr
. (Uma especialização unique_ptr<T[]>
parcial gerencia objetos de matriz alocados com new[]
, e tem o padrão deleter
default_delete<T[]>
, specialized para chamar delete[] ptr
.)
O ponteiro armazenado para um recurso possuído, stored_ptr
tem o tipo pointer
. Ele será Del::pointer
se for definido e T *
, caso não seja definido. O objeto deleter
armazenado stored_deleter
não ocupará nenhum espaço no objeto se deleter
não tiver estado. Observe que Del
pode ser um tipo de referência.
Membros
Construtores
Nome | Descrição |
---|---|
unique_ptr |
Há sete construtores para unique_ptr . |
Typedefs
Nome | Descrição |
---|---|
deleter_type |
Um sinônimo para o parâmetro de modelo Del . |
element_type |
Um sinônimo para o parâmetro de modelo T . |
pointer |
Um sinônimo para Del::pointer se definido, caso contrário T * . |
Funções
Nome | Descrição |
---|---|
get |
Retorna stored_ptr . |
get_deleter |
Retorna uma referência para stored_deleter . |
release |
Armazena pointer() em stored_ptr e retorna seu conteúdo anterior. |
reset |
Libera o recurso possuído atualmente e aceita um novo recurso. |
swap |
Troca o recurso e deleter pelo unique_ptr fornecido. |
Operadores
Nome | Descrição |
---|---|
operator bool |
O operador retorna um valor de um tipo que pode ser convertido em bool . O resultado da conversão em bool é true quando get() != pointer() , caso contrário false . |
operator-> |
A função membro retorna stored_ptr . |
operator* |
A função membro retorna *stored_ptr . |
operator= |
Atribui o valor de um unique_ptr (ou um pointer-type ) para o unique_ptr atual. |
deleter_type
O tipo é um sinônimo do parâmetro de modeloDel
.
typedef Del deleter_type;
Comentários
O tipo é um sinônimo do parâmetro de modeloDel
.
element_type
O tipo é um sinônimo do parâmetro de modeloType
.
typedef Type element_type;
Comentários
O tipo é um sinônimo do parâmetro de modeloTy
.
get
Retorna stored_ptr
.
pointer get() const;
Comentários
A função membro retorna stored_ptr
.
get_deleter
Retorna uma referência para stored_deleter
.
Del& get_deleter();
const Del& get_deleter() const;
Comentários
A função membro retorna a referência para stored_deleter
.
operator=
Atribui o endereço das unique_ptr
fornecidas para a atual.
unique_ptr& operator=(unique_ptr&& right);
template <class U, Class Del2>
unique_ptr& operator=(unique_ptr<Type, Del>&& right);
unique_ptr& operator=(pointer-type);
Parâmetros
A referência unique_ptr
usada para atribuir a unique_ptr
atual.
Comentários
As funções membro chamam reset(right.release())
e movem right.stored_deleter
para stored_deleter
, em seguida, retornam *this
.
pointer
Um sinônimo para Del::pointer
se definido, caso contrário Type *
.
typedef T1 pointer;
Comentários
O tipo de sinônimo para Del::pointer
se definido, caso contrário Type *
.
release
Libera a propriedade do ponteiro armazenado e retornado ao chamador e define o valor de ponteiro armazenado para nullptr
.
pointer release();
Comentários
Use release
para assumir a propriedade do ponteiro bruto armazenado pelo unique_ptr
. O chamador é responsável pela exclusão do ponteiro retornado. O unique-ptr
é definido como o estado vazio criado por padrão. Você pode atribuir outro ponteiro de tipo compatível para o unique_ptr
após a chamada para release
.
Exemplo
Este exemplo mostra como o chamador da versão é responsável pelo objeto retornado:
// 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
Apropria-se do parâmetro de ponteiro e, em seguida, exclui o ponteiro armazenado original. Se o novo ponteiro é o mesmo que o ponteiro armazenado original, reset
exclui o ponteiro e define o ponteiro armazenado nullptr
.
void reset(pointer ptr = pointer());
void reset(nullptr_t ptr);
Parâmetros
ptr
Um ponteiro para o recurso se apropriar.
Comentários
Use reset
para alterar o pointer
armazenado de propriedade de unique_ptr
para ptr e, em seguida, exclua o ponteiro armazenado original. Se unique_ptr
não estiver vazia, reset
invoca a função deleter retornada por get_deleter
no ponteiro armazenado original.
Porque reset
primeiro armazena o novo ponteiro ptr
, e, em seguida, exclui o ponteiro armazenado original, é possível para reset
excluir imediatamente ptr
se ele for o mesmo que o ponteiro armazenado original.
swap
Troca os valores de dois objetos de unique_ptr
.
void swap(unique_ptr& right);
Parâmetros
right
Um unique_ptr
usado para a troca de ponteiros.
Comentários
A função membro alterna stored_ptr
com right.stored_ptr
e stored_deleter
com right.stored_deleter
.
unique_ptr
Há sete construtores para 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);
Parâmetros
ptr
Um ponteiro para o recurso ser atribuído a unique_ptr
.
_Deleter
Um deleter
a ser atribuído a um unique_ptr
.
right
Um rvalue reference
para um unique_ptr
do qual unique_ptr
campos são atribuídos ao unique_ptr
recentemente construído.
Comentários
Os primeiros dois construtores constroem um objeto que não gerencia nenhum recurso. O terceiro construtor armazena ptr em stored_ptr
. O quarto construtor armazena ptr
em stored_ptr
e deleter
em stored_deleter
.
O quinto construtor armazena ptr
em stored_ptr
e move deleter
em stored_deleter
. O sexto e sétimo construtores armazenam right.release()
em stored_ptr
e move right.get_deleter()
em stored_deleter
.
~unique_ptr
O destruidor de unique_ptr
, destrói um objeto unique_ptr
.
~unique_ptr();
Comentários
O destruidor chama get_deleter()(stored_ptr)
.