Comment fonctionne unique_ptr en C++?
sobes.tech IA
Réponse de l'IA
std::unique_ptr — est un pointeur intelligent qui implémente la propriété exclusive d’un objet alloué dynamiquement. Il assure une gestion automatique de la mémoire : l’objet pointé par unique_ptr est automatiquement supprimé lors de la destruction de unique_ptr.
Caractéristiques clés :
- Propriété exclusive : À tout moment, un seul
unique_ptrpeut posséder un objet en particulier. - Absence de copie :
unique_ptrne peut pas être copié. Cela empêche la propriété multiple du même objet et le problème de "double suppression". - Semantique de déplacement : La propriété de l’objet peut être transférée d’un
unique_ptrà un autre en utilisant la sémantique de déplacement (std::move). - Deleter configurable : Il est possible de fournir un deleter personnalisé pour gérer des méthodes spécifiques de libération des ressources.
Le principe de fonctionnement repose sur RAII (Resource Acquisition Is Initialization) : la ressource (mémoire allouée dynamiquement) est acquise lors de la création de l’objet (unique_ptr) et libérée lors de sa destruction.
#include <memory> // Pour unique_ptr
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass créé\n"; }
~MyClass() { std::cout << "MyClass détruit\n"; }
};
int main() {
{
// Création d’un unique_ptr possédant un objet MyClass
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// À ce moment, ptr1 est le propriétaire exclusif de l’objet
// auto ptr2 = ptr1; // Erreur de compilation : copie interdite
// Transfert de propriété de ptr1 à ptr2
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Après le déplacement, ptr1 ne possède plus l’objet (devient nullptr)
if (!ptr1) {
std::cout << "ptr1 ne possède pas d’objet : " << (ptr1 ? "Oui" : "Non") << "\n";
}
// La portée de ptr2 se termine ici.
// ptr2 est détruit, et l’objet MyClass qu’il possède est automatiquement supprimé.
} // L’objet MyClass est détruit ici
std::cout << "Fin de main.\n";
return 0;
}
Comparaison avec raw pointer :
| Caractéristique | raw pointer |
std::unique_ptr |
|---|---|---|
| Propriété de la ressource | Non défini | Exclusive |
| Suppression automatique | Non | Oui |
| Semantique de copie | Oui | Non (seulement déplacement) |
| Risque de fuite mémoire | Élevé | Faible |
En général, unique_ptr est la méthode privilégiée pour gérer la mémoire dynamique en C++11 et versions ultérieures, lorsque la propriété stricte et la libération automatique des ressources sont requises.