Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Création et Partage de Shared Pointers | Pointeurs Partagés
Pointeurs Intelligents C++
course content

Contenu du cours

Pointeurs Intelligents C++

Pointeurs Intelligents C++

1. Introduction aux Pointeurs Intelligents
2. Pointeurs Uniques
3. Pointeurs Partagés
4. Pointeurs Faibles
5. Références
6. Sujets Avancés

book
Création et Partage de Shared Pointers

Tout comme les pointeurs uniques, nous pouvons créer des pointeurs partagés de deux manières : en utilisant std::make_shared ou l'opérateur new. Ce dernier est déconseillé, mais pour bien comprendre, nous couvrirons les deux approches.

L'approche recommandée

La manière recommandée de créer un pointeur partagé est d'utiliser la fonction std::make_shared. Cette approche est généralement plus efficace et expressive par rapport à l'utilisation de new. Elle alloue la mémoire pour l'objet et le bloc de contrôle (compte de référence) en une seule étape. Par exemple :

La ligne ci-dessus alloue un entier dynamique et initialise également un pointeur partagé vers celui-ci avec un compteur de références de 1.

L'approche déconseillée

Vous pouvez également créer des pointeurs partagés en utilisant new, mais cette méthode est déconseillée car elle n'est ni expressive ni efficace. La syntaxe pour cette approche nécessite de passer l'objet au constructeur du pointeur partagé.

Dans le code ci-dessus, nous allouons un entier dynamique puis le passons au constructeur du pointeur partagé. Cependant, le bloc de contrôle (compte de références) sera initialisé à l'intérieur du constructeur.

Cela signifie que nous effectuons deux initialisations distinctes, ce qui est inefficace et sujet à erreur.

Passer des pointeurs partagés

Les pointeurs partagés sont conçus pour un partage sécurisé. Explorons quelques façons de les transmettre.

Par affectation directe

Vous pouvez partager un pointeur partagé en l'affectant directement à un autre pointeur partagé. Cela augmente le compte de références.

Dans le code ci-dessus, nous allouons un entier dynamique qui est possédé par ptr1. À la ligne suivante, nous créons un autre pointeur partagé ptr2 qui commence également à référencer le même entier dynamique.

Retourner d'une fonction

Lorsque vous retournez un pointeur partagé d'une fonction de la manière suivante, l'appelant en reçoit la propriété.

Dans la fonction ci-dessus, nous allouons un entier dynamique à l'intérieur d'une fonction, puis transférons sa propriété à l'appelant.

Partager des objets personnalisés

Il est également possible de partager des objets personnalisés en utilisant des pointeurs partagés. Considérez cet exemple :

cpp

main

copy
123456789101112131415161718192021222324
#include <memory> #include <iostream> class MyClass { public: MyClass(int value) : data(value) {} //constructor int getData() { return data; } private: int data; }; int main() { // Creating a shared pointer to a custom object using make_shared std::shared_ptr<MyClass> obj1 = std::make_shared<MyClass>(42); // Creating another shared pointer that shares ownership with obj1 std::shared_ptr<MyClass> obj2 = obj1; // Both obj1 and obj2 now own the same custom object std::cout << "Data from obj1: " << obj1->getData() << std::endl; //prints 42 std::cout << "Data from obj2: " << obj2->getData() << std::endl; //also prints 42 }
Supposons que nous ayons 4 pointeurs partagés dans notre code. Les 4 partagent la propriété du même objet dynamique. Quand le destructeur sera-t-il appelé pour l'objet dynamique ?

Supposons que nous ayons 4 pointeurs partagés dans notre code. Les 4 partagent la propriété du même objet dynamique. Quand le destructeur sera-t-il appelé pour l'objet dynamique ?

Sélectionnez la réponse correcte

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 3. Chapitre 2
We're sorry to hear that something went wrong. What happened?
some-alt