Participer au site avec un Tip
Rechercher
 

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 :

Notre page Facebook
Notre groupe Facebook


Android Game
Line Phaser - Android Game

RAII et les « smart pointers »

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.


>> Mise en oeuvre d'une classe de « smart pointers »