1 概念
std::weak_ptr
是 C++ 标准库中的一种智能指针,它是为了配合std::shared_ptr
而存在的,用于解决循环引用导致的内存泄漏问题。std::weak_ptr
不拥有它所指向的对象的所有权,它只是对std::shared_ptr
管理的对象的一种弱引用。当最后一个std::shared_ptr
被销毁时,对象将被释放,即使有std::weak_ptr
指向该对象。
2 使用方法
(一)包含头文件
#include <memory>
(二)创建 std::weak_ptr 对象
- 通常通过一个已有的
std::shared_ptr
来创建std::weak_ptr
。
std::shared_ptr<int> sp(new int(42));
std::weak_ptr<int> wp(sp);
(三)检查所指向的对象是否仍然存在
可以使用std::weak_ptr
的expired()
方法来检查它所指向的对象是否已经被释放。如果返回true
,则表示对象已被释放;如果返回false
,则对象仍然存在。
if (wp.expired()) {
std::cout << "Object no longer exists." << std::endl;
} else {
std::cout << "Object still exists." << std::endl;
}
(四)获取指向的对象(如果存在)
可以使用std::weak_ptr
的lock()
方法来尝试获取一个指向对象的std::shared_ptr
。如果对象仍然存在,lock()
将返回一个有效的std::shared_ptr
;如果对象已被释放,lock()
将返回一个空的std::shared_ptr
。
std::shared_ptr<int> sp2 = wp.lock();
if (sp2) {
std::cout << "*sp2: " << *sp2 << std::endl;
} else {
std::cout << "Could not obtain shared_ptr." << std::endl;
}
std::weak_ptr
在避免循环引用和需要弱引用对象的场景中非常有用。