weak_ptr的lock()方法有何作用?
weak_ptr 的 lock() 方法用于获取一个指向同一对象的 shared_ptr。其核心作用与注意事项如下:
安全访问
当原始对象已被销毁时,lock()返回空的shared_ptr(即nullptr),避免悬垂指针风险。例如:auto shared = std::make_shared<int>(42); std::weak_ptr<int> weak = shared; if (auto locked = weak.lock()) { // 检查是否有效std::cout << *locked; // 安全访问 }延长生命周期
成功调用lock()会创建一个新的shared_ptr,临时增加对象的引用计数,确保在本次使用期间对象不被销毁。解决循环引用
在存在相互引用的场景中(如 A 持有 B 的shared_ptr,B 持有 A 的weak_ptr),通过lock()按需获取临时所有权,避免内存泄漏:class B; class A {std::shared_ptr<B> b_ptr; }; class B {std::weak_ptr<A> a_weak; // 使用 weak_ptr 打破循环 };线程安全
lock()是原子操作,适用于多线程环境下对共享资源的临时访问,但需注意返回的shared_ptr的生命周期管理。
使用建议:
- 始终检查
lock()返回的shared_ptr是否为空 - 避免长期持有
lock()返回的shared_ptr,防止意外延长对象生命周期
