c++智能指针类实现
来源:互联网 发布:斯特拉文斯基 知乎 编辑:程序博客网 时间:2024/06/18 08:36
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止悬垂指针的出现。在类对象中,如果定
义一个int型的指针,当多次使用同一个已存在的对象初始化一些新建对象时,已存在的对象和新建的对象都指向同一块内存区域,当我们在使用某一个对象时释放了该内存空间,
那么其它对象的int型指针域全都会失效,为了防止这种情况的产生,我们通常定义一个类,这个类里有一个引用计数器(用来统计有多少个对象指向共享内存区域)和一个int型的指
那么这块共享区域就由该智能指针类管理,下面是一张来自c++ primer的结构图:
简单实现:
/*智能指针类设计实现*/#include<iostream> #include<vector> #include<map> #include<fstream>#include<sstream> #include<algorithm>#include<list>#include<cstring>using namespace std;class smartpointer{//定义一个智能指针类private:friend class own;int *p;//被管理内存的类型size_t use;//对象使用计数器smartpointer(int *pt) :use(1), p(pt){}~smartpointer(){ delete p; }};typedef struct t{smartpointer *spt;struct t *next;}node;class own{public://复制控制部分own(int *p,int val){int flag = true;if (link == NULL){//如果是空的话node *temp = new node;temp->spt = new smartpointer(p);temp->next = NULL;link= temp;}else{node *head = link;while (head != NULL){if (p ==head->spt->p){ptr = head->spt;ptr->use++;value = val;flag = false;break;}head=head->next;}}if (true){node *temp=new node;ptr = new smartpointer(p);temp->spt = ptr;temp->next = link;link = temp;value = val;}}own & operator=(const own &obj){++obj.ptr->use;if (--ptr->use == 0)delete ptr;value = obj.value;ptr = obj.ptr;return *this;}own(const own&obj){value = obj.value;ptr = obj.ptr;ptr->use++;//两者指向同一个智能指针对象}~own(){if (ptr->use == 0)delete ptr;}//获取类的值int *get_ptr(){return ptr->p;}int get_value(){return value;}void set_ptr(int *new_ptr){//将其设置为指向一个新值的ptr->use--;if (ptr->use == 0)delete ptr;ptr = new smartpointer(new_ptr);}void set_val(int val){value = val;}private:int value;smartpointer *ptr;static node *link ;//用来保存已经存在的smartpoint类对象};node *own::link = NULL;//刚开始设为空值int main(){int *p = new int[50];own b1(p, 1);own b2(p, 2);cout << b1.get_ptr() << endl;cout << b2.get_ptr() << endl;delete []p;return 0;}/*以上智能指针的实现做了如下优化:1.当用同一块内存去建立own对象时,不会新建smartpointer类*/
其中我们用link变量将own类所有对象所指的内存区域链接起来,当用一个内存块新建一个own对象时,我们先检查p是否是已经新建的内存块,如果是的,我们就将对象的
ptr域指向已有的smartpoint类对象,如果p不存在,我们这个时候才新建一个smartpoint类对象.
0 1
- 【C++】智能指针的实现
- [c++]智能指针的实现
- C 语言实现智能指针
- 【C++】智能指针auto_ptr的简单实现
- C++(智能指针的设计与实现)
- 智能指针的类实现
- 实现一个智能指针类
- c++智能指针类实现
- 智能指针类的实现
- [C/C++] 智能指针的实现及原理
- 【C++】编写一个智能指针类。
- c++:智能指针
- C++:智能指针
- 【C++】智能指针
- 【C++】智能指针
- C++PJ智能指针
- 【c++】智能指针
- 【C++】智能指针auto_ptr
- Swift学习
- webpack配置详细设置说明
- 131. Palindrome Partitioning(递归)
- 大数据系列修炼-Scala课程65
- 类图
- c++智能指针类实现
- Python 和 Asyncio 编写在线多人游戏(一)
- Oracle从零开始-Oracle数据库卸载
- HDU 1080 Human Gene Functions DP -
- leetcode解题报告:135. Candy
- 堆栈概念及区别
- 陶哲轩实分析 7.1 节习题试解
- Tomcat7优化配置
- 自学-ES6篇-简介