实现一个懒汉单例模式C
时间: 2024-04-11 14:10:15 浏览: 19
懒汉单例模式是指在需要使用实例对象时才进行实例化,而不是在程序启动时就进行实例化。以下是一个实现懒汉单例模式的 C 代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Singleton {
int value;
} Singleton;
Singleton* getInstance() {
static Singleton* instance = NULL;
if (instance == NULL) {
instance = (Singleton*) malloc(sizeof(Singleton));
instance->value = 0;
}
return instance;
}
int main() {
Singleton* s1 = getInstance();
Singleton* s2 = getInstance();
printf("s1 value: %d\n", s1->value);
printf("s2 value: %d\n", s2->value);
s1->value = 10;
printf("s1 value: %d\n", s1->value);
printf("s2 value: %d\n", s2->value);
return 0;
}
```
在上述代码中,getInstance() 函数返回一个指向 Singleton 结构体的指针。在第一次调用 getInstance() 函数时,会执行内部的 if 语句,此时 instance 指针为 NULL,因此会进行实例化并分配内存。之后再次调用 getInstance() 函数时,会直接返回已经实例化好的 instance 指针。
在 main() 函数中,我们通过两次调用 getInstance() 函数获得两个 Singleton 实例对象 s1 和 s2,它们的值均为 0。然后我们将 s1 的 value 值设为 10,再次输出 s1 和 s2 的 value 值,发现它们的值都变成了 10。这说明 s1 和 s2 指向的是同一个 Singleton 实例对象,也就是说 getInstance() 函数确保了只有一个 Singleton 实例对象被创建。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)