C++单例类创建使用全过程
时间: 2024-09-10 12:22:11 浏览: 38
在C++中,单例模式通常用于保证全局只有一个实例存在,且易于控制其生命周期。以下是如何通过数据类(如上所示)来实现一个简单的线程安全的单例模式:
1. **定义单例类**[^1]:
```cpp
class Singleton {
private:
static Data* instance;
Singleton() { // 私有化构造函数以防止外部直接创建实例
cout << "Singleton() 构造" << endl;
}
Singleton(const Singleton&) = delete; // 防止拷贝构造
Singleton& operator=(const Singleton&) = delete; // 防止赋值操作
public:
static Data* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(singletonMutex); // 使用互斥锁保证线程安全
if (instance == nullptr) {
instance = new Data(); // 只有第一次请求时创建实例
}
}
return instance;
}
~Singleton() {
delete instance; // 单例在全局销毁时释放资源
instance = nullptr; // 设置为nullptr以避免循环引用
cout << "Singleton() 析构" << endl;
}
};
// 初始化静态成员
Singleton::instance = nullptr;
std::mutex Singleton::singletonMutex;
```
2. **访问单例**:
```cpp
int main() {
auto data1 = Singleton::getInstance();
auto data2 = Singleton::getInstance();
// 输出结果表明每次调用getInstance只会返回同一个实例
data1->doSomething(); // Data() 默认构造
data2->doSomething(); // 数据已经存在,不会执行构造
return 0;
}
```
3. **总结与注意事项**
- 单例模式确保了全局范围内只有一个实例可用。
- 通过私有化构造函数和拷贝/赋值运算符,防止了其他地方直接创建新实例。
- 使用`std::lock_guard`和静态互斥锁`singletonMutex`实现了线程安全。
阅读全文