智能指针,顾名思义它是一个聪明的指针,那么到底聪明到哪了呢,让我们一起来看以下的代码。

void test1()   //内存泄露
{int *p = new int(1);if (1){//...return;}//...//...delete p;
}

智能指针就是可以自动化地管理指针所指向的动态内存的释放。

  1. STL---AutoPtr (管理权转移,不推荐使用)包含在头文件 #include<memory>中。

新方案:(管理权转移),std::auto_ptr 能够方便的管理单个堆内存对象。

template<class T>
class AutoPtr  //管理权转移
{
public:AutoPtr(T *ptr)  :_ptr(ptr){}~AutoPtr(){if (_ptr == NULL){cout << "delete:" << _ptr << endl;delete _ptr;}}AutoPtr(AutoPtr<T> &ap):_ptr(ap._ptr){ap._ptr = NULL;   //管理权转移}AutoPtr<T>& operator=(AutoPtr<T> & ap){if (this != &ap){delete _ptr;_ptr = ap._ptr;ap._ptr = NULL;}return *this;}T &operator*(){return *_ptr;}T *operator->(){return _ptr;}
protected:T *_ptr;
};

旧方案:(在某些情况下,会产生野指针)

思路:在新方案的基础上,新增一个bool变量(_owner),只要_owner为true,才析构,不再通过将赋值的值置空。

template<class T>
class AutoPtr
{
public:AutoPtr(T *ptr):_ptr(ptr), _owner(true){}~AutoPtr(){if (_owner == true){delete _ptr;}}AutoPtr( AutoPtr<T>& ap):_ptr(ap._ptr), _owner(ap._owner){ap._owner = false;}AutoPtr<T>& operator=(AutoPtr<T>& ap){if (this != &ap){delete _ptr;_ptr = ap._ptr;_owner = ap._owner;ap._owner = false;}return *this;}
protected:T *_ptr;bool _owner;
};
void test1()
{AutoPtr<int> ap1(new int(1));AutoPtr<int> ap2(ap1);AutoPtr<int> ap3(new int(2));ap3 = ap2;
}

2. boost—ScopedPtr(防拷贝。简单、粗暴,只定义,不实现)

template<class T>
class ScopedPtr   //必须需要的1.声明,2.保护类型
{
public:ScopedPtr(T *ptr):_ptr(ptr){}~ScopedPtr(){if (_ptr == NULL){delete _ptr;}}T & operator*(){return *_ptr;}T* operator->(){return _ptr;}
protected:  //protected:防止别人搞破坏行为ScopedPtr( ScopedPtr<T> &sp);ScopedPtr<T>& operator=(ScopedPtr<T> &sp);
protected:T *_ptr;
};

3. boost—SharedPtr(引用计数的方法实现)

template<class T>
class SharedPtr   //引用计数
{
public:SharedPtr(T *ptr):_ptr(ptr), _pcount(new int(1)){}~SharedPtr(){if (--(*_pcount)==0){delete _ptr;delete _pcount;}}SharedPtr(const SharedPtr<T> &sp):_ptr(sp._ptr), _pcount(sp._pcount){++(*_pcount);}SharedPtr<T>& operator=(const SharedPtr<T>& sp){if (_ptr != sp._ptr) //防止自赋值和同时管理同一块空间{if (--(*_pcount) == 0){delete _ptr;delete _pcount;}_ptr = sp._ptr;_pcount = sp._pcount;++(*_pcount);}return *this;}T& operator*(){return *_ptr;}T* operator->(){return _ptr;}
protected:T *_ptr;int *_pcount;
};

转载于:https://blog.51cto.com/19940325/1759496

模拟实现智能指针auto_ptr,scoped_ptr,shared_ptr相关推荐

  1. C++ -- 智能指针 auto_ptr,unique_ptr,shared_ptr的简单实现和原理

    一,为什么需要智能指针 智能指针是一种预防型的内存泄漏的解决方案.由于C++没有垃圾回收器机制,所以每次new出来的资源都需要手动的delete,如果没有手动释放,就会造成资源泄漏等问题.因此,为了避 ...

  2. C++——智能指针——auto_ptr、shared_ptr、unique_ptr

    1.4.智能指针 智能指针是行为类似于指针的类对象. C++11 中提供了三种智能指针,使用这些智能指针时需要引用头文件 : ·shared_ptr; ·unique_ptr; ·auto_ptr; ...

  3. 智能指针的用法shared_ptr

    目录 智能指针 shared_ptr共享的智能指针 shared_ptr的基本用法 1.初始化 reset成员函数 make_shared swap()函数 2. 获取原始指针(get()) 3. 指 ...

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

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

  5. C++的智能指针auto_ptr、unique_ptr源码解析

    C++的智能指针auto_ptr.unique_ptr源码解析 1.前言 2.源码准备 3.源码解析 3.1.auto_ptr解析 3.2.unique_ptr解 3.3.unique_ptr的一个偏 ...

  6. c++系列 —— 智能指针auto_ptr和unique_ptr

    往期地址: c++系列一 -- c++的封装 c++系列二 -- c++的继承 c++系列三 -- 继承和多态特性 c++系列四 -- 运算符重载 c++系列五 -- 静态成员和静态类 c++系列六 ...

  7. 智能指针——auto_ptr

    1. 开篇 C++里面的四个智能指针:auto_ptr.unique_ptr.shared_ptr.weak_ptr,其中后三个是C++11支持,而这个auto_ptr已经被C++11弃用.但auto ...

  8. Boost智能指针——boost::scoped_ptr(使用及原理分析)

    简介 boost::scoped_ptr是一个比较简单的智能指针,它能保证在离开作用域之后它所管理对象能被自动释放.下面这个例子将介绍它的使用: 1 #include <iostream> ...

  9. c++11 智能指针 (std::shared_ptr)(一)

    定义于头文件 <memory> template< class T > class shared_ptr; (C++11 起) std::shared_ptr 是通过指针保持对 ...

最新文章

  1. 图灵新浪微博赠书活动
  2. php for 写入多行数据库,php – MYSQL意外插入多行
  3. js方式调用php_javascript调用PHP和PHP调用javascript的方法
  4. Android SQLite详解
  5. 大数据学习笔记54:HBase概述
  6. 1000行代码入门python-在知乎上学 Python - 爬虫篇
  7. 12306为什么要安装根证书
  8. 鲜为人知的合作:锐捷和juniper、联想和三茗
  9. 教你怎么学习arcgis软件①
  10. 魔兽争霸3地图加密,支持重制版-魔兽争霸3地图加密实操,魔兽地图加密工具
  11. (转载)七剑下天山,独领自动化测试技术
  12. IntelliJ IDEA在Mac下格式化代码快捷键
  13. 安卓高德地图 - (附近信息点Poi与标记Marker2)
  14. NEFU 大一寒假2.15考试 2020.02.15
  15. 在百度地图上展示dwg/dxf
  16. html在线表单生成,html在线编辑表格
  17. wegame饥荒一直登录中_LOL登录遇到预期之外的错误(用wegame登录出现错误而用客户端登录可以的解决方法)!亲测有效!...
  18. 三类器械计算机信息管理系统,三类医疗器械计算机管理系统要求
  19. 学习MATLAB软件心得
  20. 联想笔记本怎么开启vt模式?

热门文章

  1. 《区块链原理、设计与应用》一3.3 征信和权属管理
  2. 揭秘HPE的最新一代组合式基础设施Synergy
  3. 前台特效(6) 折叠栏目(动画效果)
  4. 【IBM Tivoli Identity Manager 学习文档】11 TIM设计思路介绍
  5. Oracle DBLink的简单运用
  6. NFV — 安全策略
  7. Prometheus — 安装部署(主机安装)
  8. Linux 操作系统原理 — 内存 — mmap 进程虚拟内存映射
  9. 用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板
  10. MDK出现红叉,程序编译正常没有错误