shared_ptr的简单实现
前面讲到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(){ }
~shared_ptr() { deconstruct();}
void deconstruct(){
if(shared_count == ) //引用计数为1表示只有一个对象使用指针指向的内存块了
{
delete m_ptr;
m_ptr = ;
}
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;
}
};
shared_ptr的简单实现的更多相关文章
- 实现一个简单的shared_ptr
翻看以前的代码的时候发现一个shared_ptr的简单实现. 我记得是网上的一篇例子(好像改了一点),但是又懒得找出处了 ╮(╯▽╰)╭. 觉得这份代码足以用来初步了解shared_ptr的实现了. ...
- C++之shared_ptr总结
转自 http://blog.csdn.net/u013696062/article/details/39665247 Share_ptr也是一种智能指针.类比于auto_ptr学习.所以推荐先学习a ...
- 【C++11新特性】 C++11智能指针之shared_ptr
C++中的智能指针首先出现在“准”标准库boost中.随着使用的人越来越多,为了让开发人员更方便.更安全的使用动态内存,C++11也引入了智能指针来管理动态对象.在新标准中,主要提供了shared_p ...
- 手动实现 shared_ptr
面试写了一个基础的 scoped_ptr,被面试官要求写 shared_ptr,一时语塞.面试官不断提示我说在现有的基础上实现 shared_ptr 很简单,真的很简单,宛如在不断暗示我 1+1 就是 ...
- Item 18: 使用srd::unique_ptr来管理独占所有权的资源
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 当你需要一个智能指针的时候,std::unique_ptr通常是最 ...
- C++11学习
转自: https://www.cnblogs.com/llguanli/p/8732481.html Boost教程: http://zh.highscore.de/cpp/boost/ 本章目的: ...
- C++11_shared_ptr
版权声明:本文为博主原创文章,未经博主允许不得转载. shared_ptr智能指针的一种,它的使用类似于auto_ptr. shared_ptr它有两个指针,一个指向引用计数,一个指向data.由于拥 ...
- STL源码剖析-waked_ptr
目录一.提问二. 代码实现2.1 mweak_ptr的具体实现2.2 测试用例一.提问weak_ptr为什么会存在?shared_ptr不是已经有了引用计数吗?具体原因详见模拟实现boost库中的sh ...
- 简单的shared_ptr实现
RT,代码参考了STL中shard_ptr的实现,基本原理是引用计数,利用Ref_cnt类来管理内存,在shared_ptr创建时创建,此后shared_ptr仅是在拷贝复制析构的过程中对引用进行修改 ...
随机推荐
- Cutting Sticks
题意: l长的木棒,给出n个切割点,每切一次的费用为切得木棒的长度,完成切割的最小费用. 分析: 区间dp入门,区间dp的特点,一个大区间的解可以转换成小区间的解组合起来,每个切割点的标号代表边界. ...
- 通过简单的Linux内核启动程序代码窥探操作系统的启动原理
作者:吴乐 山东师范大学 <Linux内核分析> 孟宁 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.程序设计与分析 ...
- PHP中我经常容易混淆的三组函数
原文:http://www.ido321.com/1252.html 一.htmlentities() 和htmlspecialchars() 1.htmlentities() 1.1 功能:把字符 ...
- HDU 3311 Dig The Wells(斯坦纳树)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3311 [题意] 给定k座庙,n个其他点,m条边,点权代表挖井费用,边权代表连边费用,问使得k座庙里 ...
- 获取week of year的小程序
#coding=utf8 import urllib, BeautifulSoup web=urllib.urlopen("http://whatweekisit.com/") s ...
- Adress
流水账的写法:因为不想让亲爱的你只看开头就关掉了我辛苦的劳作.流水账的好处是:便于逻辑的理解 http://software.intel.com/zh-cn/blogs/2014/01/20/cent ...
- linux下开发c第一弹--相关环境需求
我用的是mac,mac和linux一般集成了一定的开发环境,基本上需要gcc.vim.gdb之类的,linux下需要apt-get,mac下homebrew的brew install都可以解决问题.同 ...
- Gym 100507J Scarily interesting! (贪心)
Scarily interesting! 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/D Description This y ...
- Gradle – Spring 4 MVC Hello World Example – Annotation
In this tutorial, we will take the previous Gradle + Spring MVC XML example, rewrite it to support @ ...
- (DP6.1.4.2)POJ 1088 滑雪
其实下面用到的是搜索.(呜呜,DP写的过了测试用例但是却总是AC不了,所以改用搜索来做了) /* * POJ_1088.cpp * * Created on: 2013年10月13日 * Author ...