智能指针引用计数器版
前些日子,写过一个普通的智能指针,模拟的是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
智能指针引用计数器版相关推荐
- Rust是如何实现内存安全的--理解RAII/所有权机制/智能指针/引用
不带自动内存回收(Garbage Collection)的内存安全是Rust语言最重要的创新,是它与其他语言最主要的区别所在,是Rust语言设计的核心. Rust希望通过语言的机制和编译器的功能,把程 ...
- 共享智能指针编程实验
共享智能指针编程实验 基本知识 shared_ptr与make_shared initializer_list 自定义的StrBlob类 const限定符 示例代码 my_StrBlob.h main ...
- 五点讲述C++智能指针的点点滴滴
(在学习C/C++或者想要学习C/C++可以加我们的学习交流QQ群:712263501群内有相关学习资料) 0.摘要 本文先讲了智能指针存在之前C++面临的窘境,并顺理成章地引出利用RAII技术封装普 ...
- 【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 ...
- Android智能指针
智能指针的目标 在使用指针的时候容易出现的问题不外乎下面几个.首先,指针在使用之前都必须初始化,这个还算容易解决,在创建指针变量的时候同步初始化就好了:第二个问题就是经常忘记delete,就我的经 ...
- 详解C++11智能指针
详解C++11智能指针 前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用 ...
- C++ STL 四种智能指针
文章目录 0.前言 1.unique_ptr 2.auto_ptr 3.shared_ptr 3.1 shared_ptr 简介 3.2 通过辅助类模拟实现 shared_ptr 4.weak_ptr ...
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】...
Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...
- Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析【转】
Android系统的运行时库层代码是用C++来编写的,用C++ 来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃.不过系统为我们提供了智能指针,避免出现上述问题,本 ...
最新文章
- 中国投稿第一!ACL2021开幕,历届最大审稿团,预训练刷屏
- 吴恩达 deeplearning.ai 新课上线:TensorFlow 移动和 web 端机器学习
- 非确定性算法_带你从不同角度了解强化学习算法的分类
- 【Git】Git 修改刚提交的 commit message
- .NET c# Color对象的使用介绍(转)
- Codeforces Round #628 (Div. 2) E. Ehab‘s REAL Number Theory Problem 巧妙的质因子建图
- json/ 发送形式_24/7的完整形式是什么?
- c3等待加载样式 vue_Vue.js__简易加载等待动画
- Spring Cloud (4)---Eureka(服务注册与消费详解)
- 脑电波技术新突破:读心准确率达到95%
- 检测磁盘是否有问题的方法
- powershell局域网内同步文件夹,文件脚本
- android手机测试”
- 车架号VIN码识别api接口-vin码OCR识别-车辆识别代码识别-汽车vin码图片识别
- 图标修改器html,Iconoid(桌面图标修改器)
- 应该懂的9条经济学常识
- 索爱无线小蜜蜂扩音器:小巧便携、超大功率,讲课用它事半功倍
- GOM GEE引擎的传奇SF“怪物召唤卷”功能脚本实例分享
- 计算机技术与应用论文,计算机应用技术论文
- Tp5生成带头像二维码海报(带文字描述,居中调整)