Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Casser les Références Circulaires avec des Pointeurs Faibles | Pointeurs Faibles
Pointeurs Intelligents C++

book
Casser les Références Circulaires avec des Pointeurs Faibles

Les pointeurs faibles sont conçus pour briser les références circulaires. En remplaçant un std::shared_ptr dans une dépendance circulaire par un std::weak_ptr, nous empêchons les objets de prolonger involontairement la durée de vie les uns des autres, permettant ainsi une destruction appropriée.

main.cpp

main.cpp

copy
#include <iostream>
#include <memory>

class Node {
public:
Node() { std::cout << "Node constructed." << std::endl; }
~Node() { std::cout << "Node destructed." << std::endl; }

// A weak pointer to the next element prevents circular ownership.
std::weak_ptr<Node> next;
};

int main()
{
// Creating three Node objects.
std::shared_ptr<Node> node1 = std::make_shared<Node>();
std::shared_ptr<Node> node2 = std::make_shared<Node>();
std::shared_ptr<Node> node3 = std::make_shared<Node>();

// Creating a list where the last node's next is a weak pointer
node1->next = node2;
node2->next = node3;
node3->next = node1;
// Now when node1, node2, and node3 go out of scope, their destructors will be called
}
12345678910111213141516171819202122232425
#include <iostream> #include <memory> class Node { public: Node() { std::cout << "Node constructed." << std::endl; } ~Node() { std::cout << "Node destructed." << std::endl; } // A weak pointer to the next element prevents circular ownership. std::weak_ptr<Node> next; }; int main() { // Creating three Node objects. std::shared_ptr<Node> node1 = std::make_shared<Node>(); std::shared_ptr<Node> node2 = std::make_shared<Node>(); std::shared_ptr<Node> node3 = std::make_shared<Node>(); // Creating a list where the last node's next is a weak pointer node1->next = node2; node2->next = node3; node3->next = node1; // Now when node1, node2, and node3 go out of scope, their destructors will be called }

Le problème de référence circulaire est résolu en changeant next d'un std::shared_ptr à un std::weak_ptr. Suivez les commentaires dans le code pour une compréhension plus claire. Exécutez le code pour confirmer que les destructeurs sont maintenant appelés correctement pas de fuites de mémoire !

question mark

Le code suivant a deux pointeurs partagés A et B partageant tous deux une ressource. Modifiez-le pour que B devienne un pointeur faible.

#include <memory>

int main()
{
std::shared_ptr<int> A(new int(10));

// B is a shared pointer, sharing ownership with A. update this line
std::___<int> B = A;
}

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 3

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

We use cookies to make your experience better!
some-alt