C++ share_prt 简单设计和实现

C++ 比较烦恼的是内存的管理,new是简单,不够,delete偶尔就会忘记。或者说,出现,多个对象共享多一个内存,一个delete以后,导致其他也不能用的不良情况,所以就跑出了一个智能指针来进行管理。

 

设计需求:

1.该智能指针能接受各种类型的指针 -- 使用模板

2.智能指针需要知道该对象有多少个人在用他 -- 大家用的同一个计数器 int * num;

3.共同使用同一个内存 --  数据指针 T * data;

ps:目前为线程不安全的实现,若要达到线程安全,需要使用一个共同的互斥变量。

 

#ifndef SHARE_PTR_H
#define SHARE_PTR_Htemplate<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)  
#endiftemplate<typename T>
class share_ptr{
private:T * data;int * num;
public:share_ptr(T * t):data(t){num = new int;*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"using namespace std;int main(){{share_ptr<string> ps( new string("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");return 0;
}

 

转载于:https://www.cnblogs.com/cycxtz/p/4742970.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PID控制无人机

1、有效的办法就是&#xff0c;根据距离目标值的远近来调节云台的速度&#xff0c;离得远就转快一些&#xff0c;离得近就慢一些。这样就需要我们实时获取云台当前的实际角度&#xff0c;然后和目标角度做对比&#xff0c;根据差值来动态地调整云台的速度和方向。 2、根据无人…

学习笔记(50):Python实战编程-Frame

立即学习:https://edu.csdn.net/course/play/19711/343112?utm_sourceblogtoedu 1.Frame:是内嵌布局管理器&#xff0c;针对不同功能的组件进行区域划分&#xff0c;在各自的区域内可以使用不同的布局&#xff0c;但是总的frame布局方式还是一致的 2.以计算器为例 步骤&#…

SVN使用MySQL验证用户名密码(HTTP)

安装过程全部采用yum 1yum -y install subversion httpd mod_auth_mysql mod_dav_svn mod_ssl 使用MySQL验证是依赖于mod_auth_mysql 主要配置文件 12345678910111213141516171819202122<Location /svn > DAV svn SVNParentPath /var/www/html/svn AuthType Basic AuthNa…

Cent OS 6.4安装mysql

Cent OS6.4 RPM安装mysql 一、卸载掉原有mysql 因为目前主流Linux系统版本基本上都集成了mysql数据库在里面 如下命令来查看我们的操作系统上是否已经安装了mysql数据库 [rootxiaoluo ~]# rpm -qa | grep mysql  // 这个命令就会查看该操作系统上是否已经安装了mysql数据库 有…

学习笔记(51):Python实战编程-ListBox

立即学习:https://edu.csdn.net/course/play/19711/343113?utm_sourceblogtoedu listbox 知识点&#xff1a; 1)创建listbox: self.item_listbox tkinter.Listbox(self.root,selectmode "multiple", font("微软雅黑",12),fg "black",bg &…

C++简单工厂模式

核心思想&#xff1a;用一个工厂类根据不同的输入条件new出不同的派生类指针&#xff0c;然后由多态调用不同派生类中virtual函数&#xff0c;得到不同的结果 所有的判断处理在工厂类中完成&#xff0c;通过CreateFactory函数&#xff0c;根据不同的类型&#xff0c;new出派生类…

Saltstack的pillar组件(6)

pillar也是Saltstack最重要的组件之一&#xff0c;其作用是定义与被控主机相关的任何数据&#xff0c;定义好的数据可以被其他组件使用&#xff0c;如模板、state、API等。在pillar中定义的数据与不同业务特性的minion相关联&#xff0c;这样不同的minion只能看到自己匹配的数据…

redis投票计数

<?php /*** * 缓存利用测试&#xff0c;这里我们获取传过来的投票数据&#xff0c;每次加1&#xff0c;如果增加到了设定值&#xff0c;才将投票* 次数写回mysql&#xff0c;这大大减轻了与mysql链接的开销&#xff0c;redis的使用由此可见一斑* var unknown_type* 来自&am…

在linux系统中安装VSCode(Visual Studio Code)

1.从官网下载压缩包(话说下载下来解压就直接可以运行了咧,都不需要make) 访问Visual Studio Code官网 https://code.visualstudio.com/docs?dvlinux64 我是64位的: wget https://az764295.vo.msecnd.net/stable/7ba55c5860b152d999dda59393ca3ebeb1b5c85f/code-stable-code…

学习笔记(52):Python实战编程-Radiobutton

立即学习:https://edu.csdn.net/course/play/19711/343115?utm_sourceblogtoedu 单选钮&#xff1a;Radiobutton 1&#xff09;相对于大部分组件而言&#xff0c;最大的区别在于单选钮绑定事件是直接通过构建单选钮时方法中的command参数来进行事件的绑定&#xff0c;而其他的…

Linux文本查看命令之touch

touch可以用来创建文件或者修改文件的时间戳如果touch的文件不存在&#xff0c;就创建改文件touch命令可以修改文件的Access time和 Modify time-a 可以仅修改Access time注意&#xff1a;由于Access time的改变&#xff0c;Change time也改变了&#xff0c;但是如果cat该文件&…

dedecms手机站要同步pc站的图片

首先在dede目录下面找到 /include/extend.func.php 文件 //添加自定义函数 function replaceurl($newurl){ $newurlstr_replace(src"/1304/,src"http://www.xxx.com/1304/,$newurl); return $newurl;} 函数调用&#xff1a; functionreplaceurl(me) 例如&#xff1…

使用腾讯开发平台获取QQ用户数据资料

<今天是七夕&#xff1a;祝大家七夕嗨皮&#xff0c;前可么么哒&#xff0c;后可啪啪啪> Tips&#xff1a;本篇博客将教你如何使用腾讯开发平台获取QQ用户资料 ------------------------------------------------------------------------------------------------------…

C++的命名规范

1、 变量名前缀 i_ 类内数据成员&#xff08;对象级成员&#xff09; instance scope c_ 类内静态数据成员&#xff08;类级成员&#xff09; class scope g_ 全局变量 global scope f_ 文件作用域变量&#xff08;静态变量&…

LINUX REDHAT第十单元文档

1.系统日志默认分类#### /var/log/messages##系统服务及日志&#xff0c;包括服务的信息&#xff0c;报错等等 /var/log/secure##系统认证信息日志 /var/log/maillog##系统邮件服务信息 /var/log/cron##系统定时任务信息 /var/log/boot.log##系统启动信息 2.日志管理服务rsyslo…

学习笔记(53):Python实战编程-Checkbutton

立即学习:https://edu.csdn.net/course/play/19711/343116?utm_sourceblogtoedu 复选框Checkbutton:与单选框是相对的&#xff0c;一些用法都是类似的&#xff0c;见单选框 注&#xff1a;在设置复选框的title和index时&#xff0c;设置为选中时onvalue 1,未选中offvalue 0 …

svn merge 回滚

聊一聊 svn merge 命令。 svn 是啥就不用介绍了吧&#xff0c;谁用谁知道。有了 svn&#xff0c;开发者只要把代码提交上去&#xff0c;无论山崩地裂、电脑进水、硬盘格式化&#xff0c;哪怕换了一台电脑&#xff0c;都能随时把代码找回来。不过从自己工作中看到的现象来说&…

使用视觉信息,为什么能把移动机器人的空间位置信息记录下来

1、首先由相机的世界坐标系&#xff0c;物体的世界坐标-》相机坐标-》到投影面坐标-》到像素坐标&#xff1b; 最终一个世界中物体的三维点被记录在相机的一个转化的坐标系中&#xff1b;当同时拿到很多的物体坐标时候&#xff0c;此时相机中就拥有了该 整个观察到物体的坐标…

大三实验室 经验总结

1.高电压采样时&#xff0c;需要将多个电阻串联起来而不能使用一个等效的大电阻&#xff0c;因为同样封装下&#xff0c;一个电阻阻值太大能承受的电流就会比较小 PI*I*R。 2.单片机&#xff0c;DSP,FPGA的纯输出功能IO口&#xff0c;都应该加上74HC04非门作为硬件防火墙&#…

Spring4 MVC文件下载实例

这篇文章将向您展示如何使用Spring MVC4执行文件下载&#xff0c;我们将看到应用程序从文件系统内部以及外部文件下载文件。本教程的主要亮点&#xff1a; 下载文件是相当简单的&#xff0c;涉及以下步骤。 创建一个InputStream到文件用于下载。查找MIME类型下载文件的内容。–…