Sobes.tech
Middle

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_ptr peut posséder un objet en particulier.
  • Absence de copie : unique_ptr ne 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.