单例模式懒汉和饿汉c++
时间: 2023-09-30 13:13:17 浏览: 135
回答: 单例模式懒汉和饿汉是两种不同的实现方式。懒汉模式是指在第一次使用类的实例时才进行实例化,而饿汉模式则是在类加载时就进行了实例化。懒汉模式的实现是线程不安全的,需要加锁来保证线程安全性。饿汉模式的实现较为简单,通过在类中定义一个静态实例,在类加载时就进行了实例化,不需要进行加锁操作。在使用单例模式时,需要注意线程安全性和实例的获取方式。
相关问题
c++单例模式懒汉和饿汉
懒汉式和饿汉式是两种常见的C++单例模式实现方式。
1. 饿汉式单例模式:
饿汉式单例模式在程序加载时就创建了单例对象,无论是否使用该对象,都会占用内存空间。以下是一个示例代码:
```cpp
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有构造函数,防止外部实例化对象
public:
static Singleton* getInstance() {
return instance;
}
};
Singleton* Singleton::instance = new Singleton(); // 在程序加载时创建单例对象
int main() {
Singleton* obj = Singleton::getInstance();
return 0;
}
```
2. 懒汉式单例模式:
懒汉式单例模式在第一次使用时才创建单例对象,避免了在程序加载时就占用内存空间。以下是一个示例代码:
```cpp
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有构造函数,防止外部实例化对象
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton(); // 第一次使用时创建单例对象
}
return instance;
}
};
Singleton* Singleton::instance = nullptr; // 初始化为nullptr
int main() {
Singleton* obj = Singleton::getInstance();
return 0;
}
```
用C++写出懒汉式单例模式和饿汉式单例模式的例子
以下是C++中懒汉式单例模式和饿汉式单例模式的例子:
1. 饿汉式单例模式
```cpp
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有构造函数
public:
static Singleton* getInstance() {
return instance;
}
};
Singleton* Singleton::instance = new Singleton(); // 在类外初始化静态成员变量
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
if (s1 == s2) {
cout << "s1和s2是同一个实例" << endl;
}
return 0;
}
```
2. 懒汉式单例模式
2.1 简易版
```cpp
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有构造函数
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr; // 在类外初始化静态成员变量
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance(); if (s1 == s2) {
cout << "s1和s2是同一个实例" << endl;
}
return 0;
}
```
2.2 私有嵌套类-回收专用
```cpp
class Singleton {
private:
Singleton() {} // 私有构造函数
~Singleton() {} // 私有析构函数
static Singleton* instance;
class GarbageCollector { // 私有嵌套类
public:
~GarbageCollector() {
if (Singleton::instance != nullptr) {
delete Singleton::instance;
Singleton::instance = nullptr; }
}
};
static GarbageCollector gc; // 静态成员变量,程序结束时自动调用析构函数
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr; // 在类外初始化静态成员变量
Singleton::GarbageCollector Singleton::gc; // 在类外初始化静态成员变量
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
if (s1 == s2) {
cout << "s1和s2是同一个实例" << endl;
}
return 0;
}
```
阅读全文