Smart Pointers en C++ Moderne : std::unique_ptr et std::shared_ptr
Dites adieu aux delete manuels et aux fuites de mémoire grâce aux pointeurs intelligents introduits en C++11 et C++14.
Explications & Fondations Techniques
`std::unique_ptr` modélise la propriété exclusive d'une ressource. Il ne peut pas être copié, seulement déplacé (`std::move`), et libère sa mémoire dès qu'il sort de portée.
`std::shared_ptr` implémente un comptage de références thread-safe. La mémoire sous-jacente est libérée dès que le dernier propriétaire est détruit.
Privilégiez toujours les fonctions usines `std::make_unique<T>()` et `std::make_shared<T>()` qui sont plus sûres et optimisent les allocations de contrôle.
Exemple de Code Pratique
Exécuter dans le Playground#include <iostream>
#include <memory>
#include <string>
class Vaisseau {
public:
std::string nom;
Vaisseau(std::string n) : nom(n) { std::cout << "[+] " << nom << " construit\n"; }
~Vaisseau() { std::cout << "[-] " << nom << " detruit proprement\n"; }
void tirer() { std::cout << nom << " fait feu !\n"; }
};
int main() {
// 1. Propriété exclusive avec unique_ptr (recommandé par défaut)
auto vaisseau1 = std::make_unique<Vaisseau>("Carthage-X1");
vaisseau1->tirer();
// 2. Transfert de propriété avec move semantics
std::unique_ptr<Vaisseau> vaisseau2 = std::move(vaisseau1);
// vaisseau1 est maintenant nullptr, vaisseau2 est propriétaire
// Sortie de scope : la mémoire est désallouée automatiquement sans delete !
return 0;
}Pièges Fréquents & Mauvaises Pratiques
✗ Créer un smart pointer avec new au lieu de make_unique
std::unique_ptr<Vaisseau> v(new Vaisseau("X1")); // Déconseilléauto v = std::make_unique<Vaisseau>("X1"); // Recommandé`std::make_unique` garantit la sécurité vis-à-vis des exceptions et évite l'utilisation explicite du mot-clé new.
Questions Fréquentes
Quand choisir unique_ptr plutôt que shared_ptr ?▾
Par défaut, utilisez toujours `std::unique_ptr` : il n'a aucun surcoût de performance par rapport à un pointeur brut. N'utilisez `std::shared_ptr` que lorsque plusieurs entités indépendantes doivent réellement partager la possession de la ressource.
Maîtrisez C++ pas à pas
Résolvez des défis interactifs directement dans votre navigateur avec retour immédiat et indices progressifs.
