Smart pointers
Your native language: with Chrome, right-click on the page and select « Translate into … »
English version:
L’origine du problème
Pourquoi évoquer les pointeurs dans un cours de C++ moderne, alors que le langage s’efforce justement de les masquer ?
Prenons un exemple simple : une collection d’objets appartenant à une même hiérarchie de classes. Imaginons une classe mère A et une classe fille B. Si l’on écrit vector<A> pour stocker des objets de type A et B, un problème apparaît. En effet, un vector<A> ne peut contenir que des objets de type A. Le compilateur acceptera de stocker un objet de type B, mais uniquement en le tronquant pour le convertir vers le type A, démarche plutôt expéditive !
La solution consiste à utiliser un vector de pointeurs vers des objets de type A, le type de la classe mère. Dans ce cas précis, lorsqu’un pointeur est utilisé, le langage vérifie dynamiquement à l’exécution le type réel de l’objet.
Ainsi, tant que vous utilisez l’héritage, vous ne pouvez pas bannir complètement les pointeurs. En revanche, dans l’esprit du C++ moderne, il est recommandé de les gérer via des smart pointers. Ceux-ci combinent la performance du C++ avec une gestion mémoire plus sûre, comparable à celle d’un garbage collector en Java ou C#.
Quizzz
Syntaxe pour créer un shared pointer sur un objet de type T avec comme paramètres de construction 3 et 5. Ne pas écrire le ;
Depuis un shared pointer p, pour accéder au paramètre a, dois-je écrire p.a ?
Quelle est la valeur affichée par le code suivant :
void test(shared_ptr<Point> p) { p->Aff(); } int main() { shared_ptr<Point> p = make_shared<Point>(1,2); for (int i = 0 ; i < 3 ; i++) test(p); cout << p.use_count(); return 0; }
Un shared pointer permet de libérer l’objet pointé dès que son compteur d’utilisation vaut -1.