Notre page Facebook | |
Notre groupe Facebook |
|_Accueil Langage C++
|_RAII et les « smart pointers »
|_Mise en oeuvre d'une classe de « smart pointers »
|_Utilisation de la classe std::unique_ptr
|_Utilisation de la classe std::shared_ptr
|_Gestion des cycles de « smart pointers »
|_Application de RAII à la gestion des Mutex
Une des principales problématiques quand on code en C++ réside dans la libération de la mémoire (et plus généralement des ressources). Cela fait maintenant plusieurs décénnies que nous codons en C++ et le constat est sans appel : les développeurs passent beaucoup trop de temps à chasser les fuites mémoires. Il serait préférable d'utiliser ce temps pour plutôt travailler l'aspect fonctionnel de nos applications. Pour ce faire, il faudrait automatiser la libération des ressources.
Certains langages (Java par exemple) propose la notion de Garbage Collector (de ramasse miettes). Ce mécanisme, 100% automatique, garantie une libération de toutes vos zones mémoire devenue inutiles. Pour autant son utilisation s'avère couteuse et C++ n'a, à ce jour, pas retenu cette solution. Je pense, personnellement, que c'est un bon choix : cela permet d'avoir deux langages de programmation assez distincts et chacun d'eux pourra être une meilleure solution dans certains cas. Si ces deux langages convergeaient avec les mêmes choix technologiques, il n'y aurait alors plus d'intérêt d'avoir deux langages distincts.
Revenons à C++ ! Bjarne Stroustrup, le père du langage C++, préfère que nous utilisions le principe de « smart pointers » (de pointeurs malins) pour la gestion de la mémoire. Ce mécanisme, certes un petit peu plus complexe, est plus efficace qu'un garbage collector. En fait Bjarne Stroustrup souhaiterait que vous n'utilisiez plus que cette technique. Du coup, pour mieux diffuser cette technique de développement, il lui a donné un nom : RAII (Resource Acquisition Is Initialisation).
En quelques mot, on peut dire que RAII propose de lier l'existence d'une ressource à la durée de vie d'un (ou de plusieurs) objet(s). Du coup, l'acquisition et la libération de la ressource est associée à l'initialisation d'objet(s) (les constructeurs) mais aussi à la libération de ces objets (les destructeurs). Je vous rappelle que les constructeurs et les destructeurs sont déclenchés automatiquement sur une instance contenu par valeur.
Personnellement, j'adhère totalement à cette manière de travailler. Et j'ai envie de dire que l'utilisation du mot clé delete
c'est le « mal
absolu ». Un programme C++ moderne ne devrait plus utiliser ce mot clé. Bien entendu, en garantissant qu'il n'y ait aucune fuite mémoire dans
votre programme. D'ailleurs, certains ajouts majeurs de la version C++ 2011 sont liés à cette technique de développement qu'est RAII.
Il s'agit notamment des trois classes suivantes : std::unique_ptr
, std::shared_ptr
et std::weak_ptr
.
Mais ils aussi d'autres points du standards C++ 2011 qui sont liés à RAII.
Afin de mieux comprendre ce principe de développement, je vais commencer par vous montrer comment on pourrait coder notre propre classe de pointeurs malins.
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :