文章目录

  • 1 shared_ptr使用介绍
    • 1.1 shared_ptr使用介绍
    • 1.2 shared_ptr的使用陷阱
  • 2 weak_ptr使用简介

1 shared_ptr使用介绍

1.1 shared_ptr使用介绍

熟悉了unique_ptr 后,其实我们发现unique_ptr 这种排他型的内存管理并不能适应所有情况,有很大的局限!如果需要多个指针变量共享怎么办?

如果有一种方式,可以记录引用特定内存对象的智能指针数量,当复制或拷贝时,引用计数加1,当智能指针析构时,引用计数减1,如果计数为零,代表已经没有指针指向这块内存,那么我们就释放它!这就是 shared_ptr 采用的策略!


构造函数:

shared_ptr<T> sp ; //空的shared_ptr,可以指向类型为T的对象
shared_ptr<T> sp1(new T()) ;//定义shared_ptr,同时指向类型为T的对象
shared_ptr<T[]> sp2 ; //空的shared_ptr,可以指向类型为T[的数组对象 C++17后支持
shared_ptr<T[]> sp3(new T[]{...}) ;//指向类型为T的数组对象 C++17后支持
shared_ptr<T> sp4(NULL, D()); //空的shared_ptr,接受一个D类型的删除器,使用D释放内存
shared_ptr<T> sp5(new T(), D()); //定义shared_ptr,指向类型为T的对象,接受一个D类型的删除器,使用D删除器来释放内存

初始化:

// 方式一  构造函数
shared_ptrr<int> up1(new int(10));  //int(10) 的引用计数为1
shared_ptrr<int> up2(up1);  //使用智能指针up1构造up2, 此时int(10) 引用计数为2// 方式二 使用make_shared 初始化对象,分配内存效率更高make_shared函数的主要功能是在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr; 用法:make_shared<类型>(构造类型对象需要的参数列表);
shared_ptr<int> p4 = make_shared<int>(2); //多个参数以逗号','隔开,最多接受十个
shared_ptr<string> p4 = make_shared<string>("字符串");

赋值:

shared_ptrr<int> up1(new int(10));  //int(10) 的引用计数为1
shared_ptr<int> up2(new int(11));   //int(11) 的引用计数为1
up1 = up2;//int(10) 的引用计数减1,计数归零内存释放,up2共享int(11)给up1, int(11)的引用计数为2

主动释放对象:

shared_ptrr<int> up1(new int(10));
up1 = nullptr ;//int(10) 的引用计数减1,计数归零内存释放
up1 = NULL; //作用同上

重置:

up.reset() ;    //将p重置为空指针,所管理对象引用计数减1
up.reset(p1);   //将p重置为p1(的值),p 管控的对象计数减1,p接管对p1指针的管控
up.reset(p1,d);  //将p重置为p(的值),p 管控的对象计数减1并使用d作为删除器

交换:

std::swap(p1,p2); //交换p1 和p2 管理的对象,原对象的引用计数不变
p1.swap(p2);    //同上

1.2 shared_ptr的使用陷阱

shared_ptr作为被管控的对象的成员时,小心因循环引用造成无法释放资源!

示例代码如下:

#include <stdio.h>
#include <iostream>
#include <string>
#include <memory>
#include <vector>using namespace std;class girl;class boy {public:boy() {cout << "boy construct!" << endl;}~boy() {cout << "boy destruct!" << endl;}void set_girl_friend(shared_ptr<girl> &g) {girl_friend = g;}
private:shared_ptr<girl> girl_friend;
};class girl {public:girl() {cout << "girl construct!" << endl;}~girl() {cout << "girl destruct!" << endl;}void set_boy_friend(shared_ptr<boy> &b) {boy_friend = b;}
private:shared_ptr<boy> boy_friend;
};void use_trap() {shared_ptr<girl> sp_girl(new girl());//白娘子shared_ptr<boy> sp_boy(new boy());  //许仙sp_girl->set_boy_friend(sp_boy);sp_boy->set_girl_friend(sp_girl);}int main() {use_trap();system("pause");return 0;
}

2 weak_ptr使用简介

weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少。同时weak_ptr 没有重载*和->,但可以使用 lock 获得一个可用的 shared_ptr 对象(引用计数会增加1)。

一般情况下我们无需使用weak_ptr,只有在特殊的情况下才需要使用weak_ptr!


参考资料:

  1. C/C++从入门到精通-高级程序员之路【奇牛学院】

shared_ptr和weak_ptr使用介绍相关推荐

  1. C++智能指针:TR1的 shared_ptr 和 weak_ptr 使用介绍

    (所有示例的运行,将#序号所在main()函数去掉序号即可,参考[url]http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15361/ ...

  2. C++11智能指针(unique_ptr、shared_ptr、weak_ptr)boost::scoped_ptr

    C++11智能指针(unique_ptr.shared_ptr.weak_ptr)_-码农小非-的专栏-CSDN博客_c++ shared_ptr weak_ptr 原创)智能指针拾遗 (原创)智能指 ...

  3. C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

    目录 1.引言 2.什么是智能指针? 3.在Visual Studio中查看智能指针的源码实现 4.独占式指针unique_ptr 4.1.查看unique_ptr的源码实现片段 4.2.为什么uni ...

  4. C++ | shared_ptr与weak_ptr

    文章目录 前言 一.shared_ptr与weak_ptr是什么? 1.shared_ptr的内存模型 2.weak_ptr的内存模型 二.仿写系统的shared_ptr与weak_ptr 1.mde ...

  5. c++11 智能指针 unique_ptr、shared_ptr与weak_ptr

    C++11中有unique_ptr.shared_ptr与weak_ptr等智能指针(smart pointer),定义在<memory>中. 可以对动态资源进行管理,保证任何情况下,已构 ...

  6. C++笔记-shared_ptr与weak_ptr需要注意的地方

    目录 基本概念 代码与实例 基本概念 share_ptr使用的是引用计数,每一个shared_ptr都指向相同的内存.只有最后一个shared_ptr析构的时候,才会释放内存,不建议直接用shared ...

  7. shared_ptr,weak_ptr使用最广范的智能指针

    一:shared_ptr 基本概念: shared_ptr通过一个引用计数,共享一个对象,shared_ptr为了解决unique_ptr在对象所有权上的局限性,在使用引用计数的机制上提供了可以共享对 ...

  8. C++2.0 shared_ptr和weak_ptr深入刨析

    在gnu c++中讨论shared_ptr和weak_ptr只需要讨论__shared_count和__weak_count,另外就是weak_ptr没有定义operator ->和operat ...

  9. C++11智能指针shared_ptr、weak_ptr、unique_ptr用法

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105065859 智 ...

最新文章

  1. mybatis中(Oracle)关于insert时主键自动加1的使用方法
  2. Mybatis原理分析之一:从JDBC到Mybatis
  3. HOOK技术-满足我们程序的偷窥欲
  4. mysql proxy 读写分离 1
  5. Entity Framework Core的贴心:优雅处理带默认值的数据库字段
  6. python的selenium模块_Python中Selenium模块的使用
  7. oracle非归档模式与归档模式的备份
  8. 2.13 向量化 logistic 回归
  9. mpc 安全多方计算协议_HashKey:说透安全多方计算 MPC 技术方案、挑战与未来
  10. java 观察者模式_观察者模式(Observer Pattern)
  11. CRM----管理软件分析( ERP/CRM/OA)
  12. C语言反汇编 - 函数与结构体
  13. Ubuntu 下安装 Vysor投屏软件
  14. 一卡通管理系统总体设计
  15. 网站搜索引擎优化诊断
  16. PLSQL连接Oracle11g64位操作步骤
  17. ES6语法——for...in..以及字符串新增操作
  18. python ——随机选取n个元素
  19. WIN 7 MSN 80040154 登录问题
  20. 优惠码:牛客网-直通BAT面试算法精品课

热门文章

  1. Xilinx RAM IP核的使用
  2. C语言中 void* 详解及应用
  3. 【测试】ESP32天线信号强度比较,小龟小车A2天线esp32cam板载外置天线测试数据...
  4. 【DIY】DIYarduino温湿度计视频图文教程
  5. 2016年定制维护组总结-历程回溯
  6. Python字符串、时间戳、datetime时间相关转换
  7. 开源应用框架BitAdminCore:更新日志20180605
  8. 最简单的composer 包 使用
  9. 理解正向代理与反向代理的区别
  10. LinkedList模拟队列和堆栈