题目总结与代码归档:
【剑指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
欢迎大家来一起交流学习