文章转自:http://blog.csdn.net/weiwenhp/article/details/8707969
版权归原作者!

(原博文的评论中有反应该博文内容存在一些错误,读者请注意!!!!!!!!!!!!)

前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针,顾名思义,有个shared表明共享嘛.所以shared_ptr类型的智能指针可以做为STL容器的元素

下面我们来瞧瞧shared_ptr具体是咋实现的.相较auto_ptr有下面几个不同的地方:

1.引进了一个计数器shared_count,用来表示当前有多少个智能指针对象共享指针指向的内存块2.析构函数中不是直接释放指针对应的内存块,如果shared_count大于1则不释放内存只是将引用计数减1,只是计数等于1时释放内存3.复制构造与赋值操作符只是提供一般意义上的复制功能,并且将引用计数加1.

shared_ptr实现代码(只实现核心功能)

include <iostream>using namespace std;template<class T>class shared_ptr{
private:T* m_ptr; //被封装的指针unsigned int shared_count;   //引用计数,表示有多少个智能指针对象拥有m_ptr指向的内存块public:shared_ptr(T* p):m_ptr(p),shared_count(1){ }~shared_ptr() { deconstruct();}void deconstruct(){if(shared_count == 1)   //引用计数为1表示只有一个对象使用指针指向的内存块了{delete m_ptr;m_ptr = 0;}shared_count--;}T& operator*() { return *m_ptr;}T* operator->() { return m_ptr;}//复制构造函数shared_ptr(shared_ptr& sp):m_ptr(sp.m_ptr),shared_count(sp.shared_count){shared_count++;}//重载运算符=shared_ptr& operator = (shared_ptr& sp){sp.shared_count++;   deconstruct();  //相当于先删掉左值,然后再通过右值赋值.m_ptr = sp.m_ptr;shared_count = sp.shared_count;return *this;} };

使用举例:

假如有类struct Arwen{int age;Arwen(int gg) :age(gg) { };};//下面代码全部运行正确void main(){shared_ptr<Arwen> myPtr( new Arwen(24) );int num =myPtr->age;shared_ptr<Arwen> ptrOne( myPtr); //复制构造num =myPtr->age; //如果是auto_ptr该处会出错.因为把myPtr复制给ptrOne后,它自己本身相当于失效了num = ptrOne->age;shared_ptr<Arwen> ptrTwo = ptrOne;num = ptrOne->age;//如果是auto_ptr该处也会出错,此时ptrOne也失效了num = ptrTwo->age;return 0;}

智能指针(二):shared_ptr实现原理相关推荐

  1. 智能指针详细解析(智能指针的使用,原理解析)

    本文转自努力的少年博主: https://blog.csdn.net/sjp11/article/details/123899141 目录 一. 智能指针的基本概念 二.  智能指针的定义和使用 三. ...

  2. C++ 智能指针(二) std::unique_ptr

    C++ STL智能指针系列: C++ 智能指针(一) std::auto_ptr C++ 智能指针(二) std::unique_ptr C++ 智能指针(三) std::shared_ptr C++ ...

  3. C++ 实现智能指针:shared_ptr 和 unique_ptr

    简 述: C++11 智能指针的深入分析,和动手实现简版的智能指针 std::shared_ptr .std::unique_ptr 文章目录 背景 std::shared_ptr 原理 代码 ref ...

  4. 智能指针之shared_ptr易错点05

    一 shared_ptr易错点 1 慎用裸指针给shared_ptr赋值 例1 class A {public:A() {};A(int i) {m_i=i;cout<<"A&q ...

  5. C++ 智能指针std::shared_ptr简单使用和理解

    参考:https://blog.csdn.net/u011068702/article/details/83692838 1  智能指针std::shared_ptr相关知识和如何使用 我们这里先说下 ...

  6. C++之智能指针std::shared_ptr简单使用和理解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程 1  智能指针std::shared_ptr相关知识和如何使用 我们这里先说下智能指针std::sha ...

  7. 【C++11新特性】 C++11智能指针之shared_ptr

    http://blog.csdn.net/Xiejingfa/article/details/50750037 原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/ar ...

  8. c语言 ptr 用法,C++之智能指针std::shared_ptr简单使用和理解

    1  智能指针std::shared_ptr相关知识和如何使用 我们这里先说下智能指针std::shared_ptr,因为我看到我我们项目c++代码里面用得很多,我不是不会,所以记录学习下 先让ubu ...

  9. C++智能指针之shared_ptr

    C++智能指针之shared_ptr 前言 一.Shared_ptr 1.1 shared_ptr类的操作 1.2 make_shared函数 1.3 shared_ptr的拷贝赋值 1.4 shar ...

最新文章

  1. wps解析json数据_通过WordPress HTTP API 获取json内容并解析
  2. java学习笔记4--对象的初始化与回收
  3. 质数(Prime_Number)
  4. 基于存储过程的ASP.NET用户登录示例
  5. 查看-增强会话_会话式人工智能-关键技术和挑战-第2部分
  6. 嵌入式linux设备驱动程序是,嵌入式Linux设备驱动开发之:按键驱动程序实例-嵌入式系统-与非网...
  7. 一个Bug你改了两天,真有这么难吗?
  8. DB2存储过程分页测试
  9. H5大转盘抽奖,概率可以控制,可直接使用
  10. Windows 10微软拼音中添加自定义短语
  11. Java抓包分析四(基于jnetpcap进行抓包)——分析Http请求数据包
  12. 和大学说再见,却不跟青春道别
  13. html折叠 手风琴效果,jQuery制作效果超棒的手风琴折叠菜单
  14. 小确幸BBS论坛-1-前期准备
  15. Gif录制工具--Mac篇
  16. 电子签名合同的有效期是多久
  17. 【华为OD机试真题 JS】用连续自然数之和来表达整数
  18. VisualStudio2019,基于.NET Framework的单元测试
  19. 操作系统实验| Linux系统调用的实现
  20. .NET 爱python——pythonnet模块使用

热门文章

  1. PHP基础知识之————PDO预处理语句
  2. iOS开发 - OC - 苹果为大家提供的后台:CloudKit 的简单使用
  3. C++程序的编写和实现
  4. Cookie和Session的关系(个人理解)
  5. LeetCode 150. Evaluate Reverse Polish Notation
  6. 剑指offer——面试题34:丑数
  7. 自定义文件系统下的磁盘访问次数计算
  8. 共轭梯度法(Conjugate Gradient)
  9. Matlab之semilogx、semilogx、loglog函数
  10. 解决Mac按列浏览图加载慢的问题