网站首页 > 技术文章 正文
单例模式定义
该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
在C++中,我个人的理解是,不需要自己new类指针,这样一方面也方便程序员自己管理内存,另一方面可以节省系统指针,减少占用内存资源。
单例模式的实现要求
简单的来说,就是一个类要有唯一的单例,而且这个单例类能够被其他对象所调用,不能用,那就没意义了嘛 。
单例模式的代码实现
前面两个定义和实现要求理解之后,让我们来看看单例模式是如何在C++中被巧妙地利用。
首先看一下使用单例模式的类
头文件单例类的定义如下:
//单例模式类
class Singleton
{
public:
Singleton();
~Singleton();
void walk();
static Singleton * getSingleton(); //返回单例指针
private:
static Singleton * m_Instance;//单例全局指针
//程序结束时释放静态成员
class CGararge // 它的唯一工作就是在析构函数中删除CSingleton的实例
{
public:
~CGararge()
{
//这边清空单例指针 回收内存
if (Singleton::m_Instance)
delete Singleton::m_Instance;
}
};
static CGararge Garbo; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数
};
其中定义了单例成员指针m_Instance或获取单例指针的方式
还定义了类CGarbage 用于释放单例指针
接下来是实现cpp文件
Singleton::Singleton()
{
}
Singleton* Singleton::m_Instance = nullptr;
Singleton::~Singleton()
{
cout << "被析构了" << endl;
}
void Singleton::walk()
{
cout << " I AM WALKING ALONE" << endl;
}
Singleton* Singleton::getSingleton()
{
//如果没被实例化 就先new一个
if(m_Instance==nullptr)
{
m_Instance = new Singleton();
}
return m_Instance;
}
QT开发交流+赀料君羊:714620761
这里面很容易看出来 ?getSingleton()??函数用来new单例指针 判断是否单例指针存在,这样的好处 是可以保证整个类的全局指针 只占用一个内存地址,无需每次都要new
接下来看一下测试代码
Singleton * cur_Instance = Singleton::getSingleton();
cur_Instance->walk();
cout << "旧的地址" << cur_Instance << endl;
Singleton * cur_NextInstance = cur_Instance->getSingleton();
cur_NextInstance->walk();
cout << "新的地址"<< cur_NextInstance << endl;
int mm ;
cin >> mm;
运行程序 :
可以明显的看出,只产生了一个实例指针,这样很方便我们去管理内存,也不占用内存资源
接下来看一下不用单例模式的常规类会有什么不一样
头文件
class People
{
public:
void walk();
};
定义了一个人的类 里面一个walk方法
实现
void People::walk()
{
cout << " I AM WALKING ALONE" << endl;
}
很简单 和上面一样
接下来看一下测试代码
People *p_people = new People();
p_people->walk();
People *p_nextPeople = new People();
p_nextPeople->walk();
cout << "旧地址" << p_people << endl;
cout << "新地址" << p_nextPeople << endl;
delete p_people;
delete p_nextPeople;
测试代码也很简单
new了两个指针 然后执行walk函数 最后看一下地址 然后释放内存
看一下运行结果:
可以明显看出 这个产生了两个内存,如果在大型项目当中 需要在不同的文件当中引用类,很明显,对于程序本身占用内存 是个负担,而且 很容易造成内存泄漏的现象,所以单例模式的优势也显而易见,可以尽可能占用少的内存,并且及其易于管理内存,希望借着两个例子,能够给大家带来一点启发。
猜你喜欢
- 2024-09-24 学习C++之良好的编程习惯与编程要点
- 2024-09-24 大一萌新看过来,“这样”学C++,让你不再迷茫
- 2024-09-24 学习单例模式引发的思考
- 2024-09-24 C++中相互依赖的全局变量初始化策略
- 2024-09-24 零基础学习C++
- 2024-09-24 c++的面试总结
- 2024-09-24 避免踩坑,C++常见面试题的分析与解答
- 2024-09-24 20道必须掌握的C++题,纸上谈兵惯用伎俩
- 2024-09-24 C++11魔法静态变量magic static
- 2024-09-24 C++11 中值得关注的几大变化
你 发表评论:
欢迎- 02-20利用神经网络模型检测摄像头上的可疑行为
- 02-20直击心灵:高频核心听力你了解吗?_高频听力的正常范围值是多少
- 02-20YOLOv8 POSE+XGBoost进行人体姿态检测
- 02-20100个篮球英文术语详细解释,从此听懂NBA解说
- 02-20最全紧固件中英文对照,外贸必备词典一
- 02-20带你开发一个视频动态手势识别模型
- 02-20详细介绍一下Java基础中HashMap如何进行扩容操作?
- 02-20GTX 1070 Ti显卡评测:你会购买哪一款?
- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)