剑指offer 面试题2:实现Singleton模式【C++版本】

题目总结与代码归档:
【剑指offer-2】题目目录【C++版本】

GitHub代码路径: GitHub

面试题2

实现singleton模式

题目: 设计一个类,我们只能生成该类的一个实例。

代码实现

说明

单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例;

懒汉式

//懒汉式  存在内存泄漏的问题,new出来的东西始终没有释放
#include <iostream>
using namespace std;

class Singleton
{
private:
	//静态成员变量,且是私有的,指向一个CSingleton实例,同一时间只存在一个这个变量,所以只能存在一个CSingleton的实例
	static Singleton *local_instance;
	//构造函数是私有的,不能通过构造函数创建该类的实例
	Singleton() {};

public:
	// 只能通过这个函数来创建并获得一个CSingleton实例,且这个实例是唯一的(因为没有其他途径创建CSingleton实例,构造函数是私有的)所有GetInstance()之后的调用都返回相同实例的指针
	static Singleton *getInstance()
	{
		if (local_instance == nullptr)
		{
			cout << "getInstance new Singleton()" << endl;
			local_instance = new Singleton();
		}
		cout << "getInstance local_instance" << endl;
		return local_instance;
	}
};

Singleton * Singleton::local_instance = nullptr;	// 初始化类的静态成员变量

int main()
{
	Singleton * s = Singleton::getInstance();
	Singleton * s1 = Singleton::getInstance();
	system("pause");
	return 0;
}

上述会存在内存泄漏的问题,new出来的东西始终没有释放,可进行如下进行改进


//懒汉式  改进
#include <iostream>
using namespace std;

class Singleton
{
private:
	//静态成员变量,且是私有的,指向一个CSingleton实例,同一时间只存在一个这个变量,所以只能存在一个CSingleton的实例
	static Singleton *local_instance;
	//构造函数是私有的,不能通过构造函数创建该类的实例
	Singleton() {
		cout << "构造" << endl;
	};
	class CGarbo
	{
	public:
		~CGarbo()
		{
			if (Singleton::local_instance)
			{
				delete Singleton::local_instance;
				cout << "delete only success " << endl;
			}
		}
	};
	static CGarbo Garbo;

public:
	// 只能通过这个函数来创建并获得一个CSingleton实例,且这个实例是唯一的(因为没有其他途径创建CSingleton实例,构造函数是私有的)所有GetInstance()之后的调用都返回相同实例的指针
	static Singleton *getInstance()
	{
		if (local_instance == nullptr)
		{
			cout << "getInstance new Singleton()" << endl;
			local_instance = new Singleton();
		}
		cout << "getInstance local_instance" << endl;
		return local_instance;
	}
};

Singleton * Singleton::local_instance = nullptr;	// 初始化类的静态成员变量
Singleton::CGarbo Singleton::Garbo;

int main()
{
	Singleton * s = Singleton::getInstance();
	cout << "s = " << s << endl;
	Singleton * s1 = Singleton::getInstance();
	cout << "s1 = " << s1 << endl;
	system("pause");
	return 0;
}

类CGarbo被定义为Singleton 的私有内嵌类,以防该类被在其他地方滥用。
程序运行结束时,系统会调用Singleton 的静态成员Garbo的析构函数,该析构函数会删除单例的唯一实例。断点调试可确认静态成员Garbo的析构函数被调用

参考资料:


GitHub链接:
https://github.com/lichangke
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值