使用weak_ptr打破循环引用,避免内存泄漏。当多个shared_ptr相互持有导致引用计数无法归零时,应将非拥有关系的指针改为weak_ptr,如父子结构中子节点用weak_ptr回连父节点,从而正确释放资源。

在C++中,std::shared_ptr通过引用计数自动管理对象生命周期,但在多个
shared_ptr
当两个或多个对象通过
shared_ptr
struct Node;
using NodePtr = std::shared_ptr<Node>;
struct Node {
NodePtr parent;
NodePtr child;
~Node() { std::cout << "Node destroyed\n"; }
};
auto parent = std::make_shared<Node>();
auto child = std::make_shared<Node>();
parent->child = child;
child->parent = parent;
此时,
parent
child
解决方法是将其中一个引用改为std::weak_ptr,它不增加引用计数,仅观察对象是否存在。
立即学习“C++免费学习笔记(深入)”;
修改上面的例子:
struct Node {
NodePtr child; // 强引用
std::weak_ptr<Node> parent; // 弱引用
~Node() { std::cout << "Node destroyed\n"; }
};
访问
parent
lock()
if (auto p = parent.lock()) {
// 安全使用 p
}
这样,当外部指针释放后,引用链会被正确断开,对象得以析构。
C++标准库本身不提供自动检测机制,但可通过以下方式辅助排查:
shared_ptr
避免循环引用的根本在于合理设计对象关系:
shared_ptr
weak_ptr
weak_ptr
shared_ptr
weak_ptr
基本上就这些。关键是理解所有权关系,用
weak_ptr
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号