Passer au contenu principal
eLearner.app
Module 7 · Leçon 1 sur 215/18 dans le cours~12 min
Leçons du module (1/2)

std::unique_ptr et std::shared_ptr

En C++ classique, la gestion manuelle de la mémoire via les opérateurs new et delete est une source fréquente d'erreurs graves, telles que les fuites de mémoire (memory leaks, ressources jamais libérées) ou les pointeurs pendants (dangling pointers, pointeurs pointant vers de la mémoire déjà désallouée).

Le C++ moderne introduit les pointeurs intelligents (Smart Pointers), définis dans l'en-tête <memory>. Ils gèrent automatiquement le cycle de vie de la mémoire allouée dans le tas (heap) à l'aide de la technique RAII (Resource Acquisition Is Initialization), libérant la ressource lorsque le pointeur sort de la portée (scope).

std::unique_ptr

std::unique_ptr exprime le concept de propriété exclusive d'une ressource. Il ne peut pas être copié, mais uniquement déplacé (via std::move).

Code
#include <memory>

// Creazione consigliata tramite std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);

// Accesso alla risorsa come un normale puntatore
std::cout << *p1 << std::endl;

// std::unique_ptr<int> p2 = p1; // ERRORE DI COMPILAZIONE: copia non ammessa!
std::unique_ptr<int> p2 = std::move(p1); // Consentito: p1 cede la proprietà a p2

std::shared_ptr

std::shared_ptr implémente le concept de propriété partagée. Plusieurs pointeurs peuvent pointer vers la même ressource. La classe maintient en interne un compteur de références (reference count) : la mémoire n'est libérée que lorsque le dernier shared_ptr actif est détruit ou libéré.

Code
#include <memory>

std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Consentito: incremento del reference count

std::cout << s1.use_count() << std::endl; // Stampa 2 (s1 e s2 condividono la risorsa)

À vous de jouer

Exercice#cpp.m7.l1.e1
Tentatives : 0Chargement…

Déclarez un std::unique_ptr<int> appelé ptr en l'initialisant avec std::make_unique à la valeur 42. Affichez la valeur déréférencée de ptr à l'aide de std::cout.

Chargement de l'éditeur…
Afficher l'indice

Utilisez `std::unique_ptr<int> ptr = std::make_unique<int>(42);` puis envoyez `*ptr` vers le flux de sortie.

Solution disponible après 3 tentatives

Exercice#cpp.m7.l1.e2
Tentatives : 0Chargement…

Instanciez un std::shared_ptr<int> nommé ptr1 à la valeur 100 à l'aide de std::make_shared. Créez une copie nommée ptr2 et enfin affichez la valeur renvoyée par ptr1.use_count() via std::cout.

Chargement de l'éditeur…
Afficher l'indice

La copie s'effectue avec une affectation classique `ptr2 = ptr1;`. En affichant `ptr1.use_count()`, vous devriez voir 2.

Solution disponible après 3 tentatives