C++ share_prt 简单设计和实现
时间:2022-07-26
本文章向大家介绍C++ share_prt 简单设计和实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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 = new int;
*num = 1;
DEBUG("share_ptr(T * t):data(t)n");
}
~share_ptr(){
if(*num>1){
(*num)--;
DEBUG("~share_ptr,num = kn");
}else{
DEBUG("~share_ptr,num = 0n");
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;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript中的浏览器检测和DOM基础
- JavaScript函数和类
- 10分钟部署prometheus监控,高逼格图形展示
- R语言绘图 | 调整ggplot2坐标轴标签排列顺序
- Linux下文件字符编码格式检测和转换
- Erlang设计原则Behaviour
- Uni-app中几种常用的提示框
- 声如其闻,DuerOS中的声音播放
- JavaScript中查找指定字符串的几种方式
- Python单元测试
- 获取当前时间的标准时间,转换为年月日:时分秒的格式,以及dayjs的使用
- 8086汇编语言——双层循环的使用
- 在Linux中对文件的编码及对文件进行编码转换操作
- shutil模块,为什么说它是os模块的兄弟模块?
- HTML5+CSS3项目实战之河马牙医首页、百度首页、Mac桌面、简书首页、登录注册页面、苏宁易购首页