使用weak_ptr避免循环引用,父类用shared_ptr管理子类,子类用weak_ptr引用父类,通过lock()安全访问,确保对象正确销毁。

在C++中,shared_ptr 和 weak_ptr 经常配合使用,以解决循环引用问题并实现资源的安全管理。下面是一个典型的组合使用实例:父子对象之间的关联。
场景:避免父子节点间的循环引用
假设有一个父对象持有多个子对象,而每个子对象又需要访问其父对象。如果都用 shared_ptr,会导致循环引用,内存无法释放。
class Parent;
class Child;
using SharedParent = std::shared_ptr<Parent>;
using SharedChild = std::shared_ptr<Child>;
using WeakParent = std::weak_ptr<Parent>; // 避免循环
class Parent {
public:
std::vector<SharedChild> children;
~Parent() { std::cout << "Parent destroyed\n"; }
};
class Child {
public:
WeakParent parent; // 使用 weak_ptr 防止循环引用
void setParent(const SharedParent& p) {
parent = p;
}
void doSomething() {
if (auto p = parent.lock()) { // 尝试提升为 shared_ptr
std::cout << "Accessing parent safely\n";
} else {
std::cout << "Parent no longer exists\n";
}
}
~Child() { std::cout << "Child destroyed\n"; }
};
使用示例
创建对象并建立关系:
int main() {
{
auto parent = std::make_shared<Parent>();
auto child1 = std::make_shared<Child>();
auto child2 = std::make_shared<Child>();
child1->setParent(parent);
child2->setParent(parent);
parent->children.push_back(child1);
parent->children.push_back(child2);
child1->doSomething(); // 正常访问
child2->doSomething();
} // parent 和 child 离开作用域
// 输出:
// Accessing parent safely ×2
// Child destroyed ×2
// Parent destroyed
// 所有对象正确释放,无内存泄漏
return 0;
}
关键点说明
- 父对象通过 shared_ptr 持有子对象,保证生命周期管理
- 子对象通过 weak_ptr 引用父对象,避免引用计数增加
- 调用 lock() 安全获取 shared_ptr,检查父对象是否仍存活
- 若父对象已销毁,lock() 返回空 shared_ptr,可做容错处理
基本上就这些。这种模式广泛用于树形结构、观察者模式或任何需要反向引用但又不能延长对象生命周期的场景。
以上就是C++shared_ptr和weak_ptr组合使用实例的详细内容,更多请关注php中文网其它相关文章!