- weak_ptr只能从shared_ptr对象构建。
- weak_ptr并不影响动态对象的生命周期,即其存在与否并不影响对象的引用计数器。当weak_ptr所指向的对象因为shared_ptr计数器为0而被释放后,那么weak_ptr的lock方法将返回空。
- weak_ptr并没有重载operator->和operator *操作符,因此不可直接通过weak_ptr使用对象。
- 提供了expired()与lock()成员函数,前者用于判断weak_ptr指向的对象是否已被销毁,后者返回其所指对象的shared_ptr智能指针(对象销毁时返回”空“shared_ptr),如果返回shared_ptr,那么计数器会加1.
使用场景
-
1 当你想使用对象,但是并不管理对象,并且在需要时可以返回对象的shared_ptr时,则使用
- 比如,一个a类有两个耗时的加载方法,想在里面线程池来指向,那么就需要穿一个线程池给这个类,但是并不想让a以shared_ptr成员变量来引用这个线程池,所以通过weak_ptr方式就很ok。
-
- 解决shared_ptr的循环引用问题
- 下面代码存在循环引用问题:在这里的b和a的计数都是1,在这里当你进行析构的时候,析构一块空间,会去考虑先释放另外一块空间,然后释放另外一块空间,又要依赖于释放现在的这块空间,这样就会出现一个无限的循环,所以最终的结果是,谁都没有进行释放空间,这样就存在了内存泄漏的问题。
#include
#include
class a;
class b{
public:
~b() {
std::cout << "b destory, a_ptr use_count:" << a_ptr.use_count() << "\n";
}
std::shared_ptr