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).
#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é.
#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
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.
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
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.
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