您当前的位置: 首页 >  c++

RuiH.AI

暂无认证

  • 0浏览

    0关注

    274博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++学习 三、weak_ptr使用

RuiH.AI 发布时间:2022-01-17 11:42:47 ,浏览量:0

C++学习 三、weak_ptr使用
  • 前言
  • weak_ptr概述
  • 创建weak_ptr对象
    • 创建空weak_ptr对象
    • 使用拷贝构造函数初始化weak_ptr对象
    • 使用shared_ptr对象初始化weak_ptr对象
    • 注意:不能使用堆指针初始化weak_ptr对象
  • weak_ptr成员函数
  • weak_ptr运算符
  • 使用weak_ptr解决shared_ptr循环引用问题
    • 循环引用现象
    • 内存空间分析
    • weak_ptr解决循环引用
  • 后记

前言

本篇继续智能指针weak_ptr的学习。

weak_ptr虽然是智能指针,但实际上是作为shared_ptr的辅助指针使用。

weak_ptr概述

weak_ptr通常不单独使用,一般用于查看对应的shared_ptr的信息。weak_ptr没有重载*,->等指针运算符。

weak_ptr对象不会影响shared_ptr对象的引用计数。

创建weak_ptr对象 创建空weak_ptr对象
std::weak_ptr w1;
//std::weak_ptr w1(); // equal

注意:不能使用nullptr构造weak_ptr对象,这一点与shared_ptr,unique_ptr都不同!以下语句将报错:

//std::weak_ptr w1(nullptr); // error!
//std::weak_ptr w2 = nullptr; // error!
使用拷贝构造函数初始化weak_ptr对象
std::weak_ptr w2(w1);
//std::weak_ptr w2 = w1; // equal
使用shared_ptr对象初始化weak_ptr对象

由于weak_ptr是shared_ptr的辅助指针,因此可以通过shared_ptr对象初始化weak_ptr对象:

std::shared_ptr s3(new int(6));
std::weak_ptr w3(s3);
std::weak_ptr w4 = s3;

注意:即使通过shared_ptr对象初始化weak_ptr对象,shared_ptr对象的引用计数也不会发生变化。

注意:不能使用堆指针初始化weak_ptr对象

shared_ptr,unique_ptr都可以通过堆指针来初始化对象,但weak_ptr不行。

//std::weak_ptr w5(new double); //error!
weak_ptr成员函数

reset()使weak_ptr对象变为空指针,类似默认构造函数。(与shared_ptr,unique_ptr的reset不同,weak_ptr的reset不能带参数)。

swap(std::weak_ptr &p)交换两个weak_ptr对象的内部指针。

use_count()查看关联shared_ptr的引用计数。

expired()判断weak_ptr是否过期。如果weak_ptr为空,或者关联的shared_ptr为空,返回true。

lock()如果weak_ptr对象已过期,返回一个空shared_ptr对象;否则,返回一个weak_ptr内部指针相关联的shared_ptr对象(因此,shared_ptr对象的引用计数+1)。

weak_ptr运算符

weak_ptr类只重载了=赋值运算符,可以把一个shared_ptr或weak_ptr对象赋给另一个weak_ptr对象。

w4 = w3;
使用weak_ptr解决shared_ptr循环引用问题 循环引用现象

shared_ptr的循环引用,是因为shared_ptr对象虽然被销毁,但其引用计数没有变为0,导致开辟的内存没有被释放:

class A;
class B;

class A
{
public:
    std::shared_ptr b_;
public:
    A(){
        std::cout             
关注
打赏
1658651101
查看更多评论
0.1156s