智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。
    智能指针就是模拟指针动作的类。所有的智能指针都会重载 -> 和 * 操作符。智能指针还有许多其他功能,比较有用的是自动销毁。这主要是利用栈对象的有限作用域以及临时对象(有限作用域实现)析构函数释放内存。当然,智能指针还不止这些,还包括复制时可以修改源对象等。智能指针根据需求不同,设计也不同(写时复制,赋值即释放对象拥有权限、引用计数等,控制权转移等)。auto_ptr 即是一种常见的智能指针。

//声明文件

#pragma once//智能指针
template<class T>
class CSmartPtr
{T* m_pointer;
public://构造之后析构之前使用计数CSmartPtr(T* p = NULL);CSmartPtr(const CSmartPtr<T>& obj);~CSmartPtr();CSmartPtr<T>& operator=(const CSmartPtr<T>& obj);//重载赋值操作符T* operator->();//重载->操作符T& operator*();//重载&操作符T* get();
};//工作指针
class CWorkPtr
{template<class T> friend class CSmartPtr;//一大亮点,将类模板声明为友元类int UseCnt;//被引用的次数
public:CWorkPtr();~CWorkPtr();void Disp();
};

//实现文件

#include "stdafx.h"
#include "SmartPointer.h"//智能指针
template<class T>
CSmartPtr<T>::CSmartPtr(T* p){m_pointer = p; if (m_pointer != NULL) cout << "构造函数:" << m_pointer->UseCnt << endl;
}
template<class T>
CSmartPtr<T>::CSmartPtr(const CSmartPtr<T>& obj){m_pointer = obj.m_pointer; ++m_pointer->UseCnt; cout << "拷贝构造函数:" << m_pointer->UseCnt << endl;
}
template<class T>
CSmartPtr<T>::~CSmartPtr(){if (m_pointer != NULL && --m_pointer->UseCnt == 0){cout << "析构函数:" << m_pointer->UseCnt << endl;  delete m_pointer;}
}
template<class T>
CSmartPtr<T>& CSmartPtr<T>::operator=(const CSmartPtr<T>& obj)//重载赋值操作符
{if (this != &obj){//防止自我赋值if (m_pointer != NULL && --m_pointer->UseCnt == 0) delete m_pointer;//释放自身所拥有的工作指针m_pointer = obj.m_pointer; ++m_pointer->UseCnt; cout << "赋值函数:" << m_pointer->UseCnt << endl;//持有另外对象的工作指针}return *this;
}
template<class T>
T* CSmartPtr<T>::operator->(){ return m_pointer; }//重载->操作符
template<class T>
T& CSmartPtr<T>::operator*(){ return *m_pointer; }//重载&操作符
template<class T>
T* CSmartPtr<T>::get(){ return m_pointer; }//工作指针
CWorkPtr::CWorkPtr() : UseCnt(1) { cout << "constructor called !" << endl; }
CWorkPtr::~CWorkPtr(){ cout << "distructor called !" << endl; }
void CWorkPtr::Disp() { cout << "I'am CWorkPtr, imped the main fun. Now I am refed by " << UseCnt << " SmartPtrs. " << endl; }

//测试客户端

void main()
{cout << "初次被构造>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl;CSmartPtr<CWorkPtr> pNewPtr = new CWorkPtr();//构造函数pNewPtr->Disp();cout << "首次被引用>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl;CSmartPtr<CWorkPtr> pRef1 = pNewPtr;//拷贝构造函数pNewPtr->Disp();cout << "再次被引用>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl;CSmartPtr<CWorkPtr> pRef2; pRef2 = pRef1;//赋值函数pNewPtr->Disp();
}

Boost.auto_ptr的实现源码相关推荐

  1. 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的一个偏 ...

  2. boost原理与sklearn源码_机器学习sklearn系列之决策树

    一. Sklearn库 Scikit learn 也简称 sklearn, 自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了.支持包括分类.回归.降维和聚类四大机器 ...

  3. mysql 5.7.17 源码安装_mysql5.7.17源码安装

    创建用户和目录 groupadd mysql useradd -r -g mysql mysql mkdir -p /data/mysql/standby/data mkdir -p /data/my ...

  4. 手机编译mysql_玩转MySQL 8.0源码编译

    先说第一种,自带boost的源码编译 首先,下载带boost代码的MySQL源码包,在官网下载页面有相应的提示:  解压缩后,就可以开始编译了.首先,指定编译的选项: [root@yejr.me]# ...

  5. linux 源码搭建lnmp_详解CentOS 7.0源码包搭建LNMP 实际环境搭建

    Centos7+Nginx1.11.7+MySQL5.7.16+PHP7.1.0+openssl-1.1.0c 一.linux 系统限制配置 1.关闭系统防火墙 systemctl stop fire ...

  6. 基于Centos7.5源码编译搭建LAMP架构

    简介LAMP源码编译搭建LAMP架构 为什么要源码编译 一般来说,我们软件的安装方式有Yum(rpm),和源码编译两种方式,那么为什么我们需要源码编译安装一部分软件?选择源码编译安装软件有以下几个原因 ...

  7. boost源码剖析之:多重回调机制signal(上)

    boost源码剖析之:多重回调机制signal(上) 刘未鹏 C++的罗浮宫(http://blog.csdn.net/pongba) boost库固然是技术的宝库,却更是思想的宝库.大多数程序员都知 ...

  8. boost::asio异步模式的C/S客户端源码实现

    异步模式的服务器源码 //g++ -g async_tcp_server.cpp -o async_tcp_server -lboost_system //#include <iostream& ...

  9. boost::asio中的C/S同步实例源码

    近来狂热地研究boost的开发技术,现将读书笔记整理如下: 需要说明的是, 本博该专题下面关于boost的源码是采用boost1.55版本, 运行在Ubuntu 14.04 64bit下面, 使用ap ...

最新文章

  1. Android中View绘制流程以及invalidate()等相关方法分析
  2. 如何让PHP以root权限执行系统命令
  3. 解决Ubuntu17.04不能安装git的问题 E: Package 'git' has no installation candidate
  4. PCL—关键点检测(rangeImage)低层次点云处理
  5. UC上云 为网络大型游戏保驾护航
  6. 易语言mysql验证_易语言MySql注册登录
  7. java课程设计学生信息管理_JAVA课程设计---学生基本信息管理系统
  8. 2015-11-19 转载 DPDK支持的网卡类型
  9. 关于加密与解密、签名与验签
  10. Eclipse切换回中文
  11. linux抓包及分析
  12. python mqtt通信接口开发
  13. 怎么清理服务器数据库日志文件,SQL SERVER 数据库日志清理图文教程
  14. linux下安装虚拟天文馆,【地理软件】虚拟天文馆——stellarium
  15. 他是阿里顶尖科学家,扛起国产分布式数据库大旗,性能超Oralce 20倍!
  16. 三点运算符(三点语法)
  17. dsolve 的 用法
  18. 2022年数学建模比赛时间大全及报名费
  19. 从玉农业谋定国家龙头企业-林裕豪:对话农民丰收节交易会
  20. cf1326 E. Bombs

热门文章

  1. TypeError: xx takes 1 positional argument but 4 were given
  2. Java 泛型 <? super T> <? extend T> 的通俗理解
  3. python爬取百度百科获取中国高校信息
  4. 计算机高级工程师一般工资多少,高级工程师年薪是多少 分为哪些级别
  5. R语言 数据集处理与搭建回归模型
  6. JAVA音程_大三度和小三度
  7. 算法快学笔记(九):红黑二叉树
  8. 语雀 添加块级模式公式
  9. 我眼中的Java大牛之孤尽老师
  10. mysql数据倾斜_Hive SQL 数据倾斜总结