首页 > 编程语言 >c++中的weak_ptr的使用与理解

c++中的weak_ptr的使用与理解

时间:2023-08-07 10:57:03浏览次数:42  
标签:std weak c++ observe shared ptr 指针

weak_ptr 的使用

\(\quad\)关于为什么使用 weak_ptr,以及他的使用场景,我们在这篇文章中已经进行了介绍。而对于其具体的使用方法,比如说如何通过 weak_ptr 访问内存中的数据等操作还未提及,这里做个简单赘述。

\(\quad\)有一句话说的很好: weak_ptr就像观测者那样观测资源的使用情况。

  • 首先,weak_ptr是配合shared_ptr的使用,weak_ptr可以用shared_ptr来赋值,但当它引用shared_ptr时并不会引起它的计数。
  • 另外,weak_ptr 并没有重载解引用等操作符,也不单独使用(不能单独使用的原因是,weak_ptr没有重载解引用*、->运算符,也就是说它只能访问但不能修改)。
  • 使用expired() 检查weak_ptr的引用情况(expired()==true时表示资源已被释放),使用lock()获取一个shared_ptr的对象。

shared_ptrunique_ptr相比,weak_ptr 模板类提供的成员方法不多,以下是常用的成员方法及各自的功能:

  • operator=():重载 = 赋值运算符,是的 weak_ptr 指针可以直接被 weak_ptr 或者 shared_ptr 类型指针赋值。
  • swap(x):其中 x 表示一个同类型的 weak_ptr 类型指针,该函数可以互换 2 个同类型 weak_ptr 指针的内容。
  • reset():将当前 weak_ptr 指针置为空指针。
  • use_count():查看指向和当前 weak_ptr 指针相同的shared_ptr指针的数量。
  • expired():判断当前 weak_ptr 指针为否过期(指针为空,或者指向的堆内存已经被释放)。
  • lock():如果当前 weak_ptr 已经过期,则该函数会返回一个空的 shared_ptr 指针;反之,该函数返回一个和当前weak_ptr指向相同的 shared_ptr 指针。

示例程序

#include <iostream>
#include <memory>

void observe(std::weak_ptr<int> weak)
{
  if (auto observe = weak.lock()) {
    std::cout << "\tobserve() able to lock weak_ptr<>, value=" << *observe << "\n";
  } else {
    std::cout << "\tobserve() unable to lock weak_ptr<>\n";
  }
}

int main()
{
  std::weak_ptr<int> weak;
  std::cout << "weak_ptr<> not yet initialized\n";
  observe(weak);

  {
    auto shared = std::make_shared<int>(42);
    weak = shared;
    std::cout << "weak_ptr<> initialized with shared_ptr.\n";
    observe(weak);

    std::cout << "weak_ptr<> use_count() "<< weak.use_count() << ".\n";

    std::weak_ptr<int> weak2;
    weak2 = weak;
    std::cout << "after weak_ptr assignment, use_count is "<< weak.use_count() << ".\n";

    weak.reset();
    if (weak.expired())
      std::cout << "weak_ptr expired, con not use\n";
  }

  std::cout << "shared_ptr<> has been destructed due to scope exit.\n";
  observe(weak);
}

输出如下:

weak_ptr<> not yet initialized
	observe() unable to lock weak_ptr<>
weak_ptr<> initialized with shared_ptr.
	observe() able to lock weak_ptr<>, value=42
weak_ptr<> use_count() 1.
after weak_ptr assignment, use_count is 1.
weak_ptr expired, con not use
shared_ptr<> has been destructed due to scope exit.
	observe() unable to lock weak_ptr<>

标签:std,weak,c++,observe,shared,ptr,指针
From: https://www.cnblogs.com/weihao-ysgs/p/weak-ptr-use.html

相关文章

  • C++实现高精度减法
    一、问题描述:    高精度算法是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大......
  • 配置 Sublime Text4为 C++ 编辑器的方法
    概述涉及以下插件的安装和配置PackageControl Terminus LSP LSP-clangd clang-format LSP-pyright LSP-json配置sublime安装PackageControl以进行包管理。Terminus安装Terminus以实现sublimetext4内的terminal。绑定快捷键:[ { "keys":[ "ctrl+shift+t" ], "com......
  • msvc++工程之vs版本升级及工程目录规范
    为什么要升级msvc++工程版本对msvc++工程进行vs版本升级,一方面是可以使用较新的C++标准及对64位更好的支持。首先你需要对msvc++project文件有一定的了解,主要是vcxproj和vcxproj.filter这两个文件,升级的时候需要手动修改sln和vcxproj文件。vs(visualstuiod)中vc++工程的Filte......
  • C++核心编程——引用
    引用1引用的基本使用作用:给变量起别名语法:数据类型&别名=原名示例:intmain(){ inta=10; int&b=a; cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; b=100; cout<<"a="&......
  • C与C++之间的相互调用及函数区别
    最近项目需要使用googletest(以下简称为gtest)作为单元测试框架,但是项目本身过于庞大,main函数无从找起,需要将gtest框架编译成静态库使用。因为项目本身是通过纯c语言编写,而gtest则是一个c++编写的测试框架,其中必然涉及c与c++之间的相互调用。注意,本文的前提是,c代码采用gcc等c语言编......
  • C/C++经典书籍
    记录四本C/C++的经典书籍。最经典的莫过于1988年出版的《TheCProgrammingLanguage》第二版1.C1.1零基础:CPrimerPlus,SixthEdition,作者:StephenPrata,2013年出版,涵盖C11标准1.2C语言作者巨著(适合有C基础的阅读):TheCProgrammingLanguage,SecondEdition,作者:Denni......
  • C++入门到放弃(09)——友元:friend
    ​1.基本用法友元的概念还是比较简单的,主要作用是,让声明的友元函数或者友元类,可以直接访问当前类的私有成员。可以这样理解,友元声明代表了,向大家说明这个函数或类是我的朋友(friend),因此它可以随意使用我内部的私有成员。基本形式:friend+函数声明friend+class+类名classPoin......
  • 【VSCode】mac系统利用VSCode配置C++环境
    https://blog.csdn.net/bsy1111/article/details/131056647在官网上看到VSformac不能建C++项目,找到一个教程用VSCode配置一下C++环境可以跑点简单的代码应付一下日常使用,要是有大佬知道怎么在mac上用VisualStudio写C++的话还麻烦不吝赐教......
  • C++动态规划经典试题解析之打家劫舍系列
    1.前言力扣上有几道与打家劫舍相关的题目,算是学习动态规划时常被提及的经典试题,很有代表性,常在因内大大小小的社区内看到众人对此类问题的讨论。学习最好的方式便是归纳总结、借鉴消化,基于这个目的,本文对此类问题也做了讲解,在一些优秀思想的基础上添加了个人观点。闲话少说,进入......
  • 最低通行费C++
    题目描述】一个商人穿过一个N×N的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间1个小方格,都要花费1个单位时间。商人必须在(2N-1)个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。这个商人期望在规定时间内用最少......