智能指针weak_ptr

本文介绍了C++中的智能指针weak_ptr,它对shared_ptr管理的对象提供弱引用,不会增加引用计数。讲解了weak_ptr的构造函数、析构函数、查看引用计数、检查对象是否被删除、创建引用对象、reset和swap方法,以及owner_before的用途。
摘要由CSDN通过智能技术生成

智能指针weak_ptr对shared_ptr管理的对象存在弱引用,即weak_ptr并不会增加引用对象的引用计数。weak_ptr是对shared_ptr的一种"观察",可以检查shared_ptr管理对象的是否被删除以及引用计数等,但是weak_ptr不能直接使用引用的对象,需要使用lock接口创建其引用对象的shared_ptr。

文章的代码库为:

https://gitee.com/gamestorm577/CppStd

构造函数

weak_ptr可以的构造函数参数可以是weak_ptr或者shared_ptr,例如:

std::shared_ptr<int> sptr = std::make_shared<int>();
std::weak_ptr<int> wptr1(sptr);
std::weak_ptr<int> wptr2(wptr1);
printf("sptr use count = %ld\n", sptr.use_count());

输出结果为:

sptr use count = 1

 wptr1和wptr2引用了sptr,但并没有改变sptr的引用计数。

析构函数

销毁weak_ptr对象不会对其引用的对象产生影响

赋值函数

和构造函数一样,赋值函数的参数可以是weak_ptr或者shared_ptr,赋值操作不会对引用的shared_ptr造成影响。

查看引用计数

使用use_count接口可以查看weak_ptr引用对象的引用计数,例如:

std::shared_ptr<int> sptr1 = std::make_shared<int>();
std::shared_ptr<int> sptr2 = sptr1;
std::weak_ptr<int> wptr = sptr1;
printf("wptr use count = %ld\n", wptr.use_count());

输出结果为:

wptr use count = 2

查看引用对象是否被删除

使用expired接口可以查看weak_ptr引用的对象是否已经被删除,例如:

std::weak_ptr<int> wptr;
{
    std::shared_ptr<int> sptr = std::make_shared<int>();
    wptr = sptr;
    printf("Is sptr expired: %d\n", wptr.expired());
}
printf("Is sptr expired: %d\n", wptr.expired());

输出结果为:

Is sptr expired: 0
Is sptr expired: 1

创建被引用的对象

weak_ptr不能直接使用引用的对象,如果需要使用,可以用lock接口创建其引用对象的shared_ptr,例如:

auto FuncObserve = [](std::weak_ptr<int> wptr) -> void
{
    auto observe = wptr.lock();
    if (observe)
    {
        printf("number = %d\n", *observe);
    }
    else
    {
        printf("lock return null\n");
    }
};

std::weak_ptr<int> wptr;
{
    std::shared_ptr<int> sptr = std::make_shared<int>(25);
    wptr = sptr;
    FuncObserve(wptr);
}
FuncObserve(wptr);

输出结果为:

number = 25
lock return null

其他接口

reset

释放引用对象的所有权,对shared_ptr没有影响,例如:

std::shared_ptr<int> sptr = std::make_shared<int>();
std::weak_ptr<int> wptr = sptr;
printf("sptr use count = %ld\n", sptr.use_count());
printf("wptr use count = %ld\n", wptr.use_count());

wptr.reset();
printf("sptr use count = %ld\n", sptr.use_count());
printf("wptr use count = %ld\n", wptr.use_count());

输出结果为:

sptr use count = 1
wptr use count = 1
sptr use count = 1
wptr use count = 0

swap

交换引用的对象,引用的shared_ptr不受影响,例如:

std::shared_ptr<int> sptr1 = std::make_shared<int>(5);
std::weak_ptr<int> wptr1 = sptr1;
std::shared_ptr<int> sptr2 = std::make_shared<int>(25);
std::weak_ptr<int> wptr2 = sptr2;

printf("Before swap: \n");
printf("wptr1 number = %d\n", *wptr1.lock());
printf("wptr2 number = %d\n", *wptr2.lock());

wptr1.swap(wptr2);
printf("After swap: \n");
printf("wptr1 number = %d\n", *wptr1.lock());
printf("wptr2 number = %d\n", *wptr2.lock());

输出结果为:

Before swap: 
wptr1 number = 5
wptr2 number = 25
After swap: 
wptr1 number = 25
wptr2 number = 5

owner_before

判断第一个weak_ptr引用的shared_ptr获取对象的顺序,例如:

std::shared_ptr<int> sptr1 = std::make_shared<int>();
std::shared_ptr<int> sptr2 = sptr1;
std::shared_ptr<int> sptr3 = std::make_shared<int>();

std::weak_ptr<int> wptr1 = sptr1;
std::weak_ptr<int> wptr2 = sptr2;
std::weak_ptr<int> wptr3 = sptr3;

printf("wptr1 owner before wptr2: %d\n", wptr1.owner_before(wptr2));
printf("wptr1 owner before wptr3: %d\n", wptr1.owner_before(wptr3));
wptr1 owner before wptr2: 0
wptr1 owner before wptr3: 1

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
智能指针是C++中用于管理动态分配的内存的一种机制。它们可以自动地在不再需要时释放内存,从而避免内存泄漏和悬挂指针的问题。 shared_ptr是一种引用计数智能指针,它可以跟踪有多少个shared_ptr指向同一个对象,并在没有引用时自动释放内存。当创建shared_ptr时,它会增加引用计数,当销毁或重置shared_ptr时,它会减少引用计数。只有当引用计数为0时,才会真正释放内存。\[1\]shared_ptr可以通过构造函数接受一个指向动态分配对象的指针来创建,也可以使用std::make_shared函数来创建。\[2\] unique_ptr是一种独占智能指针,它拥有对动态分配对象的唯一所有权。当unique_ptr被销毁时,它会自动释放内存。unique_ptr不能被复制,但可以通过std::move函数进行转移所有权。\[3\]unique_ptr可以通过构造函数接受一个指向动态分配对象的指针来创建。 weak_ptr是一种弱引用智能指针,它指向由shared_ptr管理的对象,但不会增加引用计数。weak_ptr可以用于解决shared_ptr的循环引用问题,因为它不会导致对象无法释放。\[1\]weak_ptr可以通过shared_ptr的构造函数来创建。 auto_ptr是C++11之前的一种智能指针,它类似于unique_ptr,但有一些限制和问题。auto_ptr在复制时会转移所有权,这可能导致悬挂指针的问题。因此,auto_ptr已经被unique_ptr取代,不推荐使用。 总结来说,shared_ptr是引用计数智能指针,unique_ptr是独占智能指针weak_ptr是弱引用智能指针,而auto_ptr是已经过时的智能指针。它们各自有不同的用途和特点,可以根据具体的需求选择使用。 #### 引用[.reference_title] - *1* *2* *3* [C++11 解决内存泄露问题的智能指针:shared_ptr、unique_ptr、weak_ptr](https://blog.csdn.net/weixin_44120785/article/details/128714630)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值