Junior — Middle
110
Comment éviter les problèmes de références cycliques lors de l'utilisation de std::shared_ptr en appliquant std::weak_ptr?
Entreprises à qui on a demandé
Baum
Réponse de l'IA
sobes.tech IA
Циклические ссылки возникают, когда два или более объекта, управляемых std::shared_ptr, ссылаются друг на друга, что приводит к утечке памяти, так как счетчик ссылок никогда не достигает нуля.
Чтобы избежать этой проблемы, используют std::weak_ptr — слабую ссылку, которая не увеличивает счетчик ссылок объекта. Обычно в цикле одна из ссылок делается std::weak_ptr, чтобы разорвать цикл владения.
Пример:
#include <memory>
#include <iostream>
struct Node {
std::shared_ptr<Node> next;
std::weak_ptr<Node> prev; // слабая ссылка, чтобы избежать цикла
~Node() { std::cout << "Node destroyed\n"; }
};
int main() {
auto first = std::make_shared<Node>();
auto second = std::make_shared<Node>();
first->next = second;
second->prev = first; // weak_ptr не увеличивает счетчик
}
Таким образом, std::weak_ptr позволяет ссылаться на объект без увеличения счетчика ссылок, что предотвращает циклические зависимости и утечки памяти.