Programmation • IoT

Résumé : Chap 2 – std::unique_ptr et la propriété exclusive

std::unique_ptr applique le principe RAII à une ressource possédant un propriétaire unique. Au lieu de conserver un pointeur brut vers un objet créé dynamiquement et de devoir penser à appeler delete au moment approprié, on confie la ressource à un objet unique_ptr. Lorsque celui-ci atteint la fin de sa durée de vie, son destructeur détruit automatiquement la ressource qu’il possède et libère la mémoire correspondante. Cette propriété reste valable lors d’une sortie anticipée d’une fonction ou lors de la propagation d’une exception : la destruction de l’objet local entraîne celle de sa ressource. La construction avec std::make_unique est privilégiée en C++ moderne : elle crée l’objet dynamique et retourne directement le unique_ptr qui en devient propriétaire. L’utilisation de l’objet reste proche de celle d’un pointeur classique : l’opérateur * permet d’accéder à l’objet possédé et l’opérateur -> à ses membres. La différence fondamentale ne réside donc pas dans la manière d’accéder à l’objet, mais dans la gestion explicite de sa propriété et de sa durée de vie.

La propriété représentée par std::unique_ptr est exclusive : deux unique_ptr ne doivent jamais être simultanément propriétaires de la même ressource. Pour cette raison, un unique_ptr ne peut pas être copié et le compilateur refuse une opération telle que la création d’un second unique_ptr par copie du premier. Cette interdiction évite dès la compilation une situation qui pourrait conduire à plusieurs propriétaires prétendant devoir détruire la même ressource. Il reste cependant nécessaire de pouvoir changer de propriétaire : une ressource appartenant à un unique_ptr doit pouvoir être transférée à un autre sans être dupliquée. Il ne s’agit alors plus de copier la propriété, mais de la déplacer. Cette distinction entre copie et transfert conduit directement à la sémantique de déplacement du C++ moderne et à std::move : après le transfert, le nouveau unique_ptr devient propriétaire de la ressource tandis que l’ancien ne possède plus rien. std::unique_ptr introduit ainsi une idée essentielle de la gestion moderne des ressources : la propriété fait partie de la conception du programme et le système de types peut empêcher certaines erreurs de gestion avant même l’exécution.