std::weak_ptr 每次 lock() 都会导致自身use_count自增一次

代码:

#include <memory>

#include <iostream>


int main(int argc, char*argv[]){

    std::shared_ptr<int> a(new int(1));

    std::weak_ptr<int>d(a);

    std::cout<<"d.use_count() = "<<d.use_count()<<std::endl;

    std::cout<<"a.use_count() = "<<d.use_count()<<std::endl;

    std::shared_ptr<int> b = d.lock();

    std::cout<<"d.use_count() = "<<d.use_count()<<std::endl;

    std::cout<<"a.use_count() = "<<d.use_count()<<std::endl;

    std::shared_ptr<int> c = d.lock();

    std::cout<<"d.use_count() = "<<d.use_count()<<std::endl;

    std::cout<<"a.use_count() = "<<d.use_count()<<std::endl;

    return 0;

}

编译、运行:

ongonginging@localhost :~/ongonginging/test/cpp11$ g++ --std=c++11 weak.cpp 

ongonginging@localhost :~/ongonginging/test/cpp11$ ./a.out 

d.use_count() = 1

a.use_count() = 1

d.use_count() = 2

a.use_count() = 2

d.use_count() = 3

a.use_count() = 3


转载于:https://my.oschina.net/u/1176097/blog/503940

`std::weak_ptr` 是 C++11 引入的智能指针,它用于解决 `std::shared_ptr` 的循环引用问题。`std::weak_ptr` 指向 `std::shared_ptr` 管理的对象,但是不增加引用计数。因此,即使 `std::shared_ptr` 已经释放了管理的对象,`std::weak_ptr` 仍然可以保持指向该对象的引用,并且可以通过 `lock()` 方法获取一个指向该对象的 `std::shared_ptr`。 `std::weak_ptr.lock()` 方法的作用是获取一个指向 `std::weak_ptr` 所指向的对象的 `std::shared_ptr`。如果 `std::weak_ptr` 已经过期(即所指向的对象已经被释放),则返回一个空的 `std::shared_ptr`。使用 `std::weak_ptr.lock()` 方法需要注意,因为它返回的 `std::shared_ptr` 可能为空,所以在使用之前需要进行检查,以避免访问空指针。 示例代码如下: ```c++ #include <memory> #include <iostream> int main() { std::shared_ptr<int> sp = std::make_shared<int>(42); std::weak_ptr<int> wp = sp; std::shared_ptr<int> sp2 = wp.lock(); if (sp2) { std::cout << "sp2: " << *sp2 << std::endl; } else { std::cout << "wp is expired." << std::endl; } sp.reset(); sp2.reset(); sp2 = wp.lock(); if (sp2) { std::cout << "sp2: " << *sp2 << std::endl; } else { std::cout << "wp is expired." << std::endl; } return 0; } ``` 输出结果为: ``` sp2: 42 wp is expired. ``` 在示例代码中,首先创建了一个 `std::shared_ptr` 对象 `sp`,然后创建了一个 `std::weak_ptr` 对象 `wp`,并将其指向 `sp` 所管理的对象。接着使用 `wp.lock()` 方法获取一个指向该对象的 `std::shared_ptr`,并将其赋值给 `sp2`。由于 `wp` 所指向的对象还未被释放,因此 `sp2` 不为空,输出结果为 `sp2: 42`。然后通过 `sp.reset()` 将 `sp` 置为空,此时 `sp` 不再管理对象,同时 `wp` 也过期了。然后再次调用 `wp.lock()` 方法,此时 `wp` 已经过期,无法获取指向对象的 `std::shared_ptr`,因此输出结果为 `wp is expired.`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值