智能指针(二):shared_ptr实现原理
文章转自: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实现原理相关推荐
- 智能指针详细解析(智能指针的使用,原理解析)
本文转自努力的少年博主: https://blog.csdn.net/sjp11/article/details/123899141 目录 一. 智能指针的基本概念 二. 智能指针的定义和使用 三. ...
- C++ 智能指针(二) std::unique_ptr
C++ STL智能指针系列: C++ 智能指针(一) std::auto_ptr C++ 智能指针(二) std::unique_ptr C++ 智能指针(三) std::shared_ptr C++ ...
- C++ 实现智能指针:shared_ptr 和 unique_ptr
简 述: C++11 智能指针的深入分析,和动手实现简版的智能指针 std::shared_ptr .std::unique_ptr 文章目录 背景 std::shared_ptr 原理 代码 ref ...
- 智能指针之shared_ptr易错点05
一 shared_ptr易错点 1 慎用裸指针给shared_ptr赋值 例1 class A {public:A() {};A(int i) {m_i=i;cout<<"A&q ...
- C++ 智能指针std::shared_ptr简单使用和理解
参考:https://blog.csdn.net/u011068702/article/details/83692838 1 智能指针std::shared_ptr相关知识和如何使用 我们这里先说下 ...
- C++之智能指针std::shared_ptr简单使用和理解
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程 1 智能指针std::shared_ptr相关知识和如何使用 我们这里先说下智能指针std::sha ...
- 【C++11新特性】 C++11智能指针之shared_ptr
http://blog.csdn.net/Xiejingfa/article/details/50750037 原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/ar ...
- c语言 ptr 用法,C++之智能指针std::shared_ptr简单使用和理解
1 智能指针std::shared_ptr相关知识和如何使用 我们这里先说下智能指针std::shared_ptr,因为我看到我我们项目c++代码里面用得很多,我不是不会,所以记录学习下 先让ubu ...
- C++智能指针之shared_ptr
C++智能指针之shared_ptr 前言 一.Shared_ptr 1.1 shared_ptr类的操作 1.2 make_shared函数 1.3 shared_ptr的拷贝赋值 1.4 shar ...
最新文章
- wps解析json数据_通过WordPress HTTP API 获取json内容并解析
- java学习笔记4--对象的初始化与回收
- 质数(Prime_Number)
- 基于存储过程的ASP.NET用户登录示例
- 查看-增强会话_会话式人工智能-关键技术和挑战-第2部分
- 嵌入式linux设备驱动程序是,嵌入式Linux设备驱动开发之:按键驱动程序实例-嵌入式系统-与非网...
- 一个Bug你改了两天,真有这么难吗?
- DB2存储过程分页测试
- H5大转盘抽奖,概率可以控制,可直接使用
- Windows 10微软拼音中添加自定义短语
- Java抓包分析四(基于jnetpcap进行抓包)——分析Http请求数据包
- 和大学说再见,却不跟青春道别
- html折叠 手风琴效果,jQuery制作效果超棒的手风琴折叠菜单
- 小确幸BBS论坛-1-前期准备
- Gif录制工具--Mac篇
- 电子签名合同的有效期是多久
- 【华为OD机试真题 JS】用连续自然数之和来表达整数
- VisualStudio2019,基于.NET Framework的单元测试
- 操作系统实验| Linux系统调用的实现
- .NET 爱python——pythonnet模块使用