Partage via


La classe unique_ptr

Stocke un pointeur vers un objet ou un tableau détenu. L'objet/tableau n'est détenu par aucun autre unique_ptr. L'objet/tableau est détruit quand unique_ptr est détruit.

Syntaxe

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;
};

Paramètres

Right
unique_ptr.

Nptr
rvalue de type std::nullptr_t.

Ptr
pointer.

Deleter
Fonction deleter liée à un unique_ptr.

Exceptions

Aucune exception n'est générée par unique_ptr.

Notes

La classe unique_ptr remplace auto_ptr et peut être utilisée comme élément des conteneurs de bibliothèque standard C++.

Utilisez la fonction d’assistance make_unique pour créer efficacement de nouvelles instances de unique_ptr.

unique_ptr gère de façon unique une ressource. Chaque objet unique_ptr stocke un pointeur vers l'objet qu'il possède ou stocke un pointeur null. Une ressource ne peut pas être détenue par plus d’un objet unique_ptr. Lorsqu’un objet unique_ptr qui possède une ressource particulière est détruit, la ressource est libérée. Un unique_ptr objet peut être déplacé, mais pas copié ; pour plus d’informations, consultez Rvalue Reference Declarator : &&.

La ressource est libérée par l'appel à un objet deleter stocké de type Del qui sait comment les ressources sont allouées pour un unique_ptr particulier. La valeur par défaut deleter default_delete<T> suppose que la ressource pointée par ptr est allouée avec new, et qu’elle peut être libérée en appelant delete _Ptr. (Une spécialisation unique_ptr<T[]>partielle gère les objets de tableau alloués avec new[], et a la valeur par défaut deleter default_delete<T[]>, spécialisé pour appeler delete[] ptr.)

Le pointeur stocké vers une ressource détenue, stored_ptr, a le type pointer. Elle est si définie, et T * si ce n’est Del::pointer pas le cas. L'objet deleter stocké stored_deleter n'occupe pas d'espace dans l'objet si le deleter est sans état. Notez que Del peut être un type référence.

Membres

Constructeurs

Nom Description
unique_ptr Il existe sept constructeurs pour unique_ptr.

Typedefs

Nom Description
deleter_type Synonyme pour le paramètre du modèle Del.
element_type Synonyme pour le paramètre du modèle T.
pointer Synonyme pour Del::pointer s'il est défini ; sinon T *.

Functions

Nom Description
get Retourne stored_ptr.
get_deleter Retourne une référence à stored_deleter.
release Stocke pointer() dans stored_ptr et retourne son contenu précédent.
reset Libère la ressource détenue actuellement et accepte une nouvelle ressource.
swap Échange la ressource et deleter avec l'objet unique_ptr fourni.

Opérateurs

Nom Description
operator bool L'opérateur retourne une valeur d'un type qui peut être converti en bool. Le résultat de la conversion en bool est true lorsque get() != pointer(), sinon false.
operator-> La fonction membre retourne stored_ptr.
operator* La fonction membre retourne *stored_ptr.
operator= Assigne la valeur d’un objet unique_ptr (ou d’un pointer-type) à l’objet unique_ptr actuel.

deleter_type

Le type est un synonyme du paramètre de modèle Del.

typedef Del deleter_type;

Notes

Le type est un synonyme du paramètre de modèle Del.

element_type

Le type est un synonyme du paramètre de modèle Type.

typedef Type element_type;

Notes

Le type est un synonyme du paramètre de modèle Ty.

get

Retourne stored_ptr.

pointer get() const;

Notes

La fonction membre retourne stored_ptr.

get_deleter

Retourne une référence à stored_deleter.

Del& get_deleter();

const Del& get_deleter() const;

Notes

La fonction membre retourne une référence à stored_deleter.

operator=

Affecte l'adresse du unique_ptr fourni à l'objet actif.

unique_ptr& operator=(unique_ptr&& right);
template <class U, Class Del2>
unique_ptr& operator=(unique_ptr<Type, Del>&& right);
unique_ptr& operator=(pointer-type);

Paramètres

Référence unique_ptr utilisée pour affecter la valeur au unique_ptr actif.

Notes

Les fonctions membres appellent reset(right.release()) et déplacent right.stored_deleter vers stored_deleter, puis retournent *this.

pointer

Synonyme pour Del::pointer s'il est défini ; sinon Type *.

typedef T1 pointer;

Notes

Le type est un synonyme de Del::pointer s'il est défini ; sinon Type *.

release

Libère la propriété du pointeur stocké retourné pour l'appelant et définit la valeur de pointeur stocké sur nullptr.

pointer release();

Notes

Utilisez release pour prendre possession du pointeur brut stocké par le pointeur unique_ptr. L'appelant est responsable de la suppression du pointeur retourné. Le pointeur unique-ptr est défini sur l'état construit par défaut vide. Vous pouvez affecter un autre pointeur de type compatible au pointeur unique_ptr après l'appel à release.

Exemple

Cet exemple montre comment l’appelant de release est responsable de l’objet retourné :

// 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

Prend possession du paramètre de pointeur et supprime le pointeur stocké d'origine. Si le nouveau pointeur est le même que le pointeur d'origine stocké, reset supprime le pointeur et définit le pointeur stocké sur nullptr.

void reset(pointer ptr = pointer());
void reset(nullptr_t ptr);

Paramètres

ptr
Pointeur vers la ressource dont il faut prendre possession.

Notes

Permet reset de modifier le stockage détenu pointer par le unique_ptr ptr , puis de supprimer le pointeur stocké d’origine. Si ce unique_ptr n’était pas vide, reset appelle la fonction deleter retournée par get_deleter le pointeur stocké d’origine.

Étant donné que reset le nouveau pointeur stocke le nouveau pointeur ptr, puis supprime le pointeur stocké d’origine, il est possible de reset supprimer ptr immédiatement s’il est identique au pointeur stocké d’origine.

swap

Échange des pointeurs entre deux objets unique_ptr.

void swap(unique_ptr& right);

Paramètres

right
unique_ptr utilisé pour échanger des pointeurs.

Notes

La fonction membre échange stored_ptr avec right.stored_ptr et stored_deleter avec right.stored_deleter.

unique_ptr

Il existe sept constructeurs pour 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);

Paramètres

ptr
Pointeur vers la ressource à affecter à un unique_ptr.

_Deleter
deleter à affecter à un unique_ptr.

right
rvalue reference à un unique_ptr à partir duquel des champs unique_ptr sont affectés par déplacement au unique_ptr nouvellement construit.

Notes

Les deux premiers constructeurs construisent un objet qui ne gère aucune ressource. Le troisième constructeur stocke ptr dans stored_ptr. Le quatrième constructeur stocke ptr dans stored_ptr et deleter dans stored_deleter.

Le cinquième constructeur stocke ptr dans stored_ptr et déplace deleter dans stored_deleter. Les sixième et septième constructeurs stockent right.release() dans stored_ptr et déplacent right.get_deleter() dans stored_deleter.

~unique_ptr

Destructeur de unique_ptr. Détruit un objet unique_ptr.

~unique_ptr();

Notes

Le destructeur appelle get_deleter()(stored_ptr).