C++ share_prt 简单设计和实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++ share_prt 简单设计和实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2778字,纯文字阅读大概需要4分钟。
内容图文
![C++ share_prt 简单设计和实现](/upload/InfoBanner/zyjiaocheng/1063/9a61afc513b540ef80c931d4fbaf4ae3.jpg)
C++ 比较烦恼的是内存的管理,new是简单,不够,delete偶尔就会忘记。或者说,出现,多个对象共享多一个内存,一个delete以后,导致其他也不能用的不良情况,所以就跑出了一个智能指针来进行管理。
设计需求:
1.该智能指针能接受各种类型的指针 -- 使用模板
2.智能指针需要知道该对象有多少个人在用他 -- 大家用的同一个计数器 int * num;
3.共同使用同一个内存 -- 数据指针 T * data;
ps:目前为线程不安全的实现,若要达到线程安全,需要使用一个共同的互斥变量。
#ifndef SHARE_PTR_H #define SHARE_PTR_H template<typename T> class share_ptr{ private: T * data; int * num; public: /** * @brief 构造函数,通过传入的对象指针进行初始化, * 并将计数器置1 */ share_ptr(T * t):data(t); /** * @brief 析构函数,判断当前对象是否为最后一个, * 是就delete,不是就计数减1 */ ~share_ptr(); /** * @brief 拷贝构造函数,通过rhs的值赋值, * 并将计数器加1 */ share_ptr(share_ptr<T>& rhs); /** * @brief 赋值,判断当前对象是否一致, * 是则返回,不是则析构之前的,并用现在的赋值, * 计数器加1 */ share_ptr<T>& operator =( share_ptr<T>& rhs); /** * @brief 返回数据的引用 */ T& operator *(){ return *data; } /** * @brief 返回数据的指针 */ T* operator ->() { return data; } /** * @brief 获取当前有多少个共同使用者 */int count(){ return *num;} }; #endif//SHARE_PTR_H
实现
#ifndef SHARE_PTR_H #define SHARE_PTR_H #include <stdio.h> #include <iostream> #ifdef _DEBUG #define DEBUG(fmt) printf (fmt) #else#define DEBUG(x) #endif template<typename T> class share_ptr{ private: T * data; int * num; public: share_ptr(T * t):data(t){ num = newint; *num = 1; DEBUG("share_ptr(T * t):data(t)\n"); } ~share_ptr(){ if(*num>1){ (*num)--; DEBUG("~share_ptr,num = k\n"); }else{ DEBUG("~share_ptr,num = 0\n"); delete data; delete num; data = NULL; num = NULL; } } //拷贝构造 share_ptr(share_ptr<T>& rhs){ data = rhs.data; num = rhs.num; (*num)++; DEBUG("share_ptr(share_ptr<T>& rhs)\n"); } //赋值 share_ptr<T>& operator =( share_ptr<T>& rhs){ if( data == rhs.data){ DEBUG("share_prt<T>& operator=(share_ptr<T>& rhs)\n"); return *this; }else{ //判断本来指向的指针是否是最后一个,是的话,就delete掉,不是的话就*num--if(*num == 1){ delete data; delete num; data = NULL; num = NULL; }else{ (*num)--; } data = rhs.data; num = rhs.num; (*num)++; } DEBUG("share_prt<T>& operator=(share_ptr<T>& rhs)\n"); return *this; } T& operator *(){ return *data; } T* operator ->() { return data; } int count(){ return *num;} }; #endif//SHARE_PTR_H
测试:
#include <iostream> #include <string> #include "share_ptr.h"usingnamespace std; int main(){ { share_ptr<string> ps( newstring("hello world") ); cout << *ps <<" count:"<< ps.count() << endl; share_ptr<string> ps2(ps); cout << *ps2 <<" count:"<< ps2.count() << endl; share_ptr<string> ps3 = ps; cout << *ps3 <<" count:"<< ps2.count() << endl; ps2 = ps3; cout << *ps2 <<" count:"<< ps2.count() << endl; } system("pause"); return0; }
原文:http://www.cnblogs.com/cycxtz/p/4742970.html
内容总结
以上是互联网集市为您收集整理的C++ share_prt 简单设计和实现全部内容,希望文章能够帮你解决C++ share_prt 简单设计和实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。