前些日子,写过一个普通的智能指针,模拟的是boost中的auto_ptr,今天又写了一个关于boost中的share_ptr,引用计数器智能指针,感觉还行,功能基本实现,设计思想基本上是这么一回事,智能指针类管理资源,引用计数器类管理是否有多个智能指针指向同一个资源,如果有为这个资源设一个引用计数器,计数器值表示有多少个智能指针在使用这个资源,一旦有一个智能指针准备释放这个资源,仅仅对计数器减一,只有当没有智能指针指向这个资源,才真正的释放资源,当然你也可以强制让所有的智能指针释放这个资源,直接delete掉资源,然后将所有的智能指针delete掉。

下面是我代码:

#include <iostream>using namespace std;class Test
{
private:int n;
public:Test(int m):n(m){}~Test(){ cout<<"Test destructor function is called\n"; }void get(){ cout<<"Test get() is called\n"; }
};class CountPtr
{
public:Test* ptr;int usecount;
public:CountPtr(Test* p):ptr(p){usecount = 1;cout<<"CountPtr constructor function is called\n";}~CountPtr(){ cout<<"CountPtr destructor function is called\n"; delete ptr;  }};class SmartPtr
{
private:CountPtr* ptr;
public:SmartPtr(Test* p){ cout<<"SmartPtr constructor function is called\n";ptr = new CountPtr(p);}~SmartPtr(){ptr->usecount--;if(ptr->usecount == 0)   //只有所有的智能指针都释放资源,才能将资源delete掉{cout<<"SmartPtr destructor function is called\n";delete ptr;}}SmartPtr(const SmartPtr& p)  //智能指针拷贝构造函数,因为有了拷贝构造函数才使其他的智能指针才能共享资源,不过这个是针对浅拷贝,深拷贝可以无视{cout<<"SmartPtr copy constructor function is called\n";ptr = p.ptr;ptr->usecount++;}SmartPtr& operator=(const SmartPtr& p)  //智能指针赋值构造函数,因为有了赋值构造函数才使其他的智能指针才能共享资源,不过这个是针对浅拷贝,深拷贝可以无视{cout<<"SmartPtr assign constructor function is called\n";if(this == &p)return *this;ptr->usecount--;if(ptr->usecount == 0){delete ptr;ptr = NULL;}ptr = p.ptr;return *this;}Test* operator->(){    return ptr->ptr;}
};int main()
{{SmartPtr ptr(new Test(8));ptr->get();SmartPtr p1 = ptr;SmartPtr p2(new Test(7));p2 = ptr;    }return 0;
}

转载于:https://www.cnblogs.com/GODYCA/archive/2013/01/19/2868112.html

智能指针引用计数器版相关推荐

  1. Rust是如何实现内存安全的--理解RAII/所有权机制/智能指针/引用

    不带自动内存回收(Garbage Collection)的内存安全是Rust语言最重要的创新,是它与其他语言最主要的区别所在,是Rust语言设计的核心. Rust希望通过语言的机制和编译器的功能,把程 ...

  2. 共享智能指针编程实验

    共享智能指针编程实验 基本知识 shared_ptr与make_shared initializer_list 自定义的StrBlob类 const限定符 示例代码 my_StrBlob.h main ...

  3. 五点讲述C++智能指针的点点滴滴

    (在学习C/C++或者想要学习C/C++可以加我们的学习交流QQ群:712263501群内有相关学习资料) 0.摘要 本文先讲了智能指针存在之前C++面临的窘境,并顺理成章地引出利用RAII技术封装普 ...

  4. 【Smart_Point】C/C++ 中智能指针

    C++11智能指针 目录 C++11智能指针 1.1 C++11智能指针介绍 1.2 为什么要使用智能指针 1.2.1 auto_ptr(C++98的方案,C++11已经抛弃)采用所有权模式. 1.2 ...

  5. Android智能指针

    智能指针的目标   在使用指针的时候容易出现的问题不外乎下面几个.首先,指针在使用之前都必须初始化,这个还算容易解决,在创建指针变量的时候同步初始化就好了:第二个问题就是经常忘记delete,就我的经 ...

  6. 详解C++11智能指针

    详解C++11智能指针 前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用 ...

  7. C++ STL 四种智能指针

    文章目录 0.前言 1.unique_ptr 2.auto_ptr 3.shared_ptr 3.1 shared_ptr 简介 3.2 通过辅助类模拟实现 shared_ptr 4.weak_ptr ...

  8. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】...

    Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...

  9. Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】

    Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...

最新文章

  1. 中国投稿第一!ACL2021开幕,历届最大审稿团,预训练刷屏
  2. 吴恩达 deeplearning.ai 新课上线:TensorFlow 移动和 web 端机器学习
  3. 非确定性算法_带你从不同角度了解强化学习算法的分类
  4. 【Git】Git 修改刚提交的 commit message
  5. .NET c# Color对象的使用介绍(转)
  6. Codeforces Round #628 (Div. 2) E. Ehab‘s REAL Number Theory Problem 巧妙的质因子建图
  7. json/ 发送形式_24/7的完整形式是什么?
  8. c3等待加载样式 vue_Vue.js__简易加载等待动画
  9. Spring Cloud (4)---Eureka(服务注册与消费详解)
  10. 脑电波技术新突破:读心准确率达到95%
  11. 检测磁盘是否有问题的方法
  12. powershell局域网内同步文件夹,文件脚本
  13. android手机测试”
  14. 车架号VIN码识别api接口-vin码OCR识别-车辆识别代码识别-汽车vin码图片识别
  15. 图标修改器html,Iconoid(桌面图标修改器)
  16. 应该懂的9条经济学常识
  17. 索爱无线小蜜蜂扩音器:小巧便携、超大功率,讲课用它事半功倍
  18. GOM GEE引擎的传奇SF“怪物召唤卷”功能脚本实例分享
  19. 计算机技术与应用论文,计算机应用技术论文
  20. Tp5生成带头像二维码海报(带文字描述,居中调整)

热门文章

  1. IntelliSense: const char * 类型的实参与 LPCTSTR 类型的形参不兼容
  2. Spectral clustering 谱聚类讲解及实现
  3. 微信数据分析包准备(Python)
  4. 1.windows网络配置无法上网
  5. mysql数据库有几种删除方式_sql有几种删除表数据的方式
  6. PyTorch中MaxPool的ceil_mode属性
  7. SQL SERVER-日期按时区转换
  8. Git远程推送和抓取分支
  9. webpack优化相关操作
  10. JAVA学习笔记系列4-Eclipse版本选择