Contenu du cours
Pointeurs Intelligents C++
Pointeurs Intelligents C++
Fonctionnement Interne d'un Pointeur Unique
Lorsque vous créez un nouveau pointeur unique, il alloue de la mémoire pour la ressource sur le tas. Le tas est une partie de la mémoire du programme réservée à l'allocation dynamique de mémoire.
Lorsque le pointeur unique sort de la portée (par exemple, une fonction se termine ou un bloc se termine), le destructeur de la ressource pointée est appelé. Ce destructeur, à son tour, supprime la ressource et libère la mémoire associée. Ce processus se produit automatiquement, même en cas d'exceptions, rendant les pointeurs uniques exceptionnellement sûrs et fiables.
Fonctions de pointeur unique à retenir
En plus des fonctions que nous avons discutées dans les sections précédentes, voici quelques autres fonctions essentielles de pointeur unique dont vous devriez être conscient :
reset
Cette fonction peut être utilisée pour faire pointer un pointeur unique vers une nouvelle ressource ou pour libérer la ressource actuelle sans la détruire.
Dans la ligne de code ci-dessus, nous appelons reset()
sans paramètre, ce qui définit le pointeur unique à null
, et supprime la ressource associée.
Ici, nous passons un argument à la fonction reset()
. Ce code remplacera l'ancien objet pointé par un nouvel objet.
release
La fonction release
est utilisée pour libérer la propriété de la ressource du pointeur unique, sans détruire la ressource.
Dans le code ci-dessus, nous utilisons l'appel release()
pour prendre la propriété de l'objet de ptr
et la transférer à ptr2
. Après l'exécution de cette ligne, ptr
sera null
.
Il est important de noter que release()
n'appelle pas le destructeur pour la ressource pointée. Considérez le code suivant :
releaseBadExample
std::unique_ptr<int> intPtr = std::make_unique<int>(42); intPtr.release(); //memory leak introduced here, dont do this.
Remarque
Le code ci-dessus entraînera une fuite de mémoire, car nous avons appelé
release()
mais n'avons pas assigné la valeur retournée à une variable.
operator* et operator->
Ces opérateurs vous permettent d'accéder à la ressource comme si vous travailliez directement avec elle. Ils fournissent une manière naturelle et intuitive d'interagir avec l'objet géré.
Merci pour vos commentaires !