C++11智能指针之weak_ptr

含义

Weak shared pointer
比较特殊的函数有lock和expired

函数lock

std::weak_ptr::lockshared_ptr<element_type> lock() const noexcept;
Lock and restore weak_ptr.
Returns a shared_ptr with the information preserved by the weak_ptr object if it is not expired.
If the weak_ptr object has expired (including if it is empty), the function returns an empty shared_ptr (as if default-constructed).
Because shared_ptr objects count as an owner, this function locks the owned pointer, preventing it from being released (for at least as long as the returned object does not releases it).

函数expired

std::weak_ptr::expiredbool expired() const noexcept;
Check if expired
Returns whether the weak_ptr object is either empty or there are no more shared_ptr in the owner group it belongs to.

Expired pointers act as empty weak_ptr objects when locked, and thus can no longer be used to restore an owning shared_ptr.

This function shall return the same as (use_count()==0), although it may do so in a more efficient way.

举例

例子1

#include <iostream>
#include <memory>
using namespace std;

int main()
{
    shared_ptr<int> sp1(new int(11));
    shared_ptr<int> sp2 = sp1;

    weak_ptr<int> wp=sp1;
    cout << "num=" << sp1.use_count() << endl;
    cout << "num=" << sp2.use_count() << endl;
    cout << "num=" << wp.use_count() << endl;

    shared_ptr<int> sp3 = wp.lock();
    cout << "num2=" << sp1.use_count() << endl;
    cout << "num2=" << sp2.use_count() << endl;
    cout << "num2=" << sp3.use_count() << endl;
    cout << "num2=" << wp.use_count() << endl;

    sp1.reset();
    sp2.reset();
    sp3.reset();
    cout << "num3=" << sp1.use_count() << endl;
    cout << "num3=" << sp2.use_count() << endl;
    cout << "num3=" << sp3.use_count() << endl;
    cout << "num3=" << wp.use_count() << endl;
    //当堆空间释放后
    shared_ptr<int> tmp = wp.lock();
    if(tmp == nullptr)
    {
        cout << "heap is null" << endl;
    }

    return 0;
}

输出结果:
num=2
num=2
num=2
num2=3
num2=3
num2=3
num2=3
num3=0
num3=0
num3=0
num3=0
heap is null

例子2

#include <iostream>
#include <memory>
using namespace std;

int main () {
    std::shared_ptr<int> sp1,sp2;
    std::weak_ptr<int> wp;
                                                               // sharing group:
                                                               // --------------
    sp1 = std::make_shared<int> (20);    // sp1
    wp = sp1;                                           // sp1, wp

    std::cout << "num= " << sp1.use_count() << '\n';
    std::cout << "num=" << sp2.use_count() << '\n';
    std::cout << "num=" << wp.use_count() << '\n';

    sp2 = wp.lock();                                // sp1, wp, sp2
    sp1.reset();                                        //      wp, sp2

    std::cout << "num2= " << sp1.use_count() << '\n';
    std::cout << "num2=" << sp2.use_count() << '\n';
    std::cout << "num2=" << wp.use_count() << '\n';

    sp1 = wp.lock();                                // sp1, wp, sp2

    std::cout << "*sp1: " << *sp1 << '\n';
    std::cout << "*sp2: " << *sp2 << '\n';
    std::cout << "num3= " << sp1.use_count() << '\n';
    std::cout << "num3=" << sp2.use_count() << '\n';
    std::cout << "num3=" << wp.use_count() << '\n';

  return 0;
}

结果如下:
num= 1
num=0
num=1
num2= 0
num2=1
num2=1
*sp1: 20
*sp2: 20
num3= 2
num3=2
num3=2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值