广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言智能指针shared_ptr和weak_ptr怎么用
  • 525
分享到

C语言智能指针shared_ptr和weak_ptr怎么用

2023-06-30 00:06:36 525人浏览 独家记忆
摘要

这篇文章主要讲解了“C语言智能指针shared_ptr和weak_ptr怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言智能指针shared_ptr和weak_ptr怎么用”吧!w

这篇文章主要讲解了“C语言智能指针shared_ptr和weak_ptr怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言智能指针shared_ptr和weak_ptr怎么用”吧!

weak_ptr引入可以解决shared_ptr交叉引用时无法释放资源的问题。

示例代码:

#include <iOStream>#include <memory>using namespace std;class B;class A{public:    A(){cout << "A constructor ... "<< endl;}    ~A(){cout << "A destructor ..." << endl;}    std::shared_ptr<B> pb;};class B{public:    B(){cout << "B constructor ... "<< endl;}    ~B(){cout << "B destructor ..." << endl;}    std::shared_ptr<A> pa;};int main(int arGC, char **argv) {        std::shared_ptr<int> a = std::make_shared<int>(3);    std::shared_ptr<char> b = std::make_shared<char>('a');        std::cout << "shared_ptr object(int) size = " << sizeof(a) << std::endl;    std::cout << "shared_ptr object(char) size = " << sizeof(b) << std::endl;        std::weak_ptr<A> shadow_a;    std::weak_ptr<B> shadow_b;        {    std::shared_ptr<A> ptr_a = std::make_shared<A>();    std::shared_ptr<B> ptr_b = std::make_shared<B>();        shadow_a = ptr_a;    shadow_b = ptr_b;        ptr_a->pb = ptr_b;    ptr_b->pa = ptr_a;        cout << "reference count of A = " << shadow_a.use_count() << endl;    cout << "reference count of B = " << shadow_b.use_count() << endl;    cout << endl;     }        cout << "reference count of A = " << shadow_a.use_count() << endl;    cout << "reference count of B = " << shadow_b.use_count() << endl;        std::cout << "Hello, world!" << std::endl;    return 0;}

运行代码得到以下输出:

shared_ptr object(int) size = 16
shared_ptr object(char) size = 16
A constructor ... 
B constructor ... 
reference count of A = 2
reference count of B = 2

reference count of A = 1
reference count of B = 1
Hello, world!

从结果可以看出,由于交叉引用导致申请的内存A,B无法正常释放。
为什么会这样呢?这个应该从析构原理进行考虑,shared_ptr引用计数需要为0才会进行析构!但是ptr_a离开作用域会导致A引用计数减少1,但是A的引用计数此时为1,那么 pb不会释放;同理,ptr_b离开作用域会导致B引用计数减少1,但是B的引用计数为此时为1,那么pa不会释放。如此导致了资源无法释放掉。
由于weak_ptr并不会改变shared_ptr的引用计数,所以修改类A,和类B中的shared_ptr对象为weak_ptr对象即可释放资源。

修改后的代码如下:

#include <iostream>#include <memory>using namespace std;class B;class A{public:    A(){cout << "A constructor ... "<< endl;}    ~A(){cout << "A destructor ..." << endl;}    //std::shared_ptr<B> pb;    std::weak_ptr<B> pb;};class B{public:    B(){cout << "B constructor ... "<< endl;}    ~B(){cout << "B destructor ..." << endl;}    //std::shared_ptr<A> pa;    std::weak_ptr<A> pa;};int main(int argc, char **argv) {        std::shared_ptr<int> a = std::make_shared<int>(3);    std::shared_ptr<char> b = std::make_shared<char>('a');        std::cout << "shared_ptr object(int) size = " << sizeof(a) << std::endl;    std::cout << "shared_ptr object(char) size = " << sizeof(b) << std::endl;        std::weak_ptr<A> shadow_a;    std::weak_ptr<B> shadow_b;        {    std::shared_ptr<A> ptr_a = std::make_shared<A>();    std::shared_ptr<B> ptr_b = std::make_shared<B>();        shadow_a = ptr_a;    shadow_b = ptr_b;        ptr_a->pb = ptr_b;    ptr_b->pa = ptr_a;        cout << "reference count of A = " << shadow_a.use_count() << endl;    cout << "reference count of B = " << shadow_b.use_count() << endl;    cout << endl;     }        cout << "reference count of A = " << shadow_a.use_count() << endl;    cout << "reference count of B = " << shadow_b.use_count() << endl;        std::cout << "Hello, world!" << std::endl;    return 0;}

运行结果如下,可以正常释放资源。

shared_ptr object(int) size = 16
shared_ptr object(char) size = 16
A constructor ... 
B constructor ... 
reference count of A = 1
reference count of B = 1

B destructor ...
A destructor ...
reference count of A = 0
reference count of B = 0
Hello, world!

感谢各位的阅读,以上就是“C语言智能指针shared_ptr和weak_ptr怎么用”的内容了,经过本文的学习后,相信大家对C语言智能指针shared_ptr和weak_ptr怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C语言智能指针shared_ptr和weak_ptr怎么用

本文链接: https://www.lsjlt.com/news/326820.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言 智能指针 shared_ptr 和 weak_ptr
    weak_ptr引入可以解决shared_ptr交叉引用时无法释放资源的问题。 示例代码: #include <iostream> #include <memory...
    99+
    2022-11-13
  • C语言智能指针shared_ptr和weak_ptr怎么用
    这篇文章主要讲解了“C语言智能指针shared_ptr和weak_ptr怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言智能指针shared_ptr和weak_ptr怎么用”吧!w...
    99+
    2023-06-30
  • C++智能指针shared_ptr与weak_ptr的实现分析
    目录shared_ptrweak_ptr内存模型RefCnt 和 Mdel实现shared_ptr 实现weak_ptr 实现shared_from_this()循环引用shared...
    99+
    2022-11-13
  • C语言智能指针之weak_ptr浅析
    目录前言使用环境测试过程现象分析总结前言 weak_ptr这个指针天生一副“小弟”的模样,也是在C++11的时候引入的标准库,它的出现完全是为了弥补它老大shared_ptr天生有缺...
    99+
    2022-11-12
  • C++11中的智能指针shared_ptr、weak_ptr源码解析
    目录1、前言2、源码准备3、智能指针概念4、源码解析4.1、shared_ptr解析4.1.1、shared_ptr4.1.2、__shared_ptr4.1.3、__shared_...
    99+
    2022-11-12
  • C++智能指针shared_ptr怎么使用
    本篇内容介绍了“C++智能指针shared_ptr怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、什么是shared_ptr?C+...
    99+
    2023-06-29
  • C++11智能指针weak_ptr怎么使用
    本篇内容主要讲解“C++11智能指针weak_ptr怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11智能指针weak_ptr怎么使用”吧!弱指针weak_ptr看起来更像shar...
    99+
    2023-06-19
  • C++11智能指针shared_ptr怎么使用
    本篇内容介绍了“C++11智能指针shared_ptr怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!shared_prt的本身是一个...
    99+
    2023-06-19
  • C++智能指针之shared_ptr如何使用
    这篇文章主要介绍“C++智能指针之shared_ptr如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++智能指针之shared_ptr如何使用”文章能帮助大家解决问题。std::share...
    99+
    2023-06-30
  • C++中智能指针最常用的shared_ptr和unique_ptr
    目录shared_ptr使用shared_ptr注意unique_ptrshared_ptr 基本用法: 可以通过构造函数, make_shared<T>辅助函数和res...
    99+
    2022-11-13
  • C++智能指针之shared_ptr的具体使用
    目录std::shared_ptr概念shared_ptr模板类shared_ptr的构造和析构shared_ptr赋值make_shared计数线程安全?enable_shared...
    99+
    2022-11-13
  • 关于C++智能指针shared_ptr和unique_ptr能否互转问题
    C++中的智能指针最常用的是shared_ptr和unique_ptr,C++新手最常问的问题是我从一个函数中拿到unique_ptr,但要转成shared_ptr才能使用,要怎么...
    99+
    2022-11-13
  • C语言指针怎么用
    这篇文章主要为大家展示了“C语言指针怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言指针怎么用”这篇文章吧。一、字符指针在指针的类型中我们知道有一种指针类型为字符指针 char* 。思...
    99+
    2023-06-25
  • C++Smart Pointer智能指针怎么用
    这篇文章主要讲解了“C++Smart Pointer智能指针怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++Smart Pointer智能指针怎么用”吧!一、为...
    99+
    2023-06-29
  • C++中怎么使用智能指针
    这篇文章给大家介绍C++中怎么使用智能指针,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、为什么要使用智能指针一句话带过:智能指针就是帮我们C++程序员管理动态分配的内存的,它会帮助我们自动释放new出来的内存,从而...
    99+
    2023-06-20
  • C语言数组指针和指针数组怎么应用
    这篇文章主要介绍“C语言数组指针和指针数组怎么应用”,在日常操作中,相信很多人在C语言数组指针和指针数组怎么应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数组指针和指针数组怎么应用”的疑惑有所帮助!...
    99+
    2023-06-30
  • C语言中指针怎么用
    这篇文章给大家分享的是有关C语言中指针怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.1:概述1.1.1:内存内存含义:储存器:用来存储程序和数据,辅助CPU进行运算处理的重要组成部分。内存:内部存储器,...
    99+
    2023-06-25
  • 深入学习C++智能指针之shared_ptr与右值引用的方法
    目录1. 介绍2. 初始化方法2.1 通过构造函数初始化2.2 通过拷贝和移动构造函数初始化2.3 通过 std::make_shared 初始化2.4 通过 reset 方法初始化...
    99+
    2022-11-12
  • C++11中的智能指针怎么用
    本篇内容介绍了“C++11中的智能指针怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!函数原型:shared_ptr& oper...
    99+
    2023-06-19
  • C语言中怎么使用指针函数和函数指针
    本篇内容介绍了“C语言中怎么使用指针函数和函数指针”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、指针函数当一个函数声明其返回值为一个指针...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作