C++: 单例模式和缺陷

简介: C++: 单例模式和缺陷   实现一个单例模式 1 class Singleton { 2     private: 3         Singleton() { cout

C++: 单例模式和缺陷

 

实现一个单例模式

1 class Singleton {
2     private:
3         Singleton() { cout << "Singleton::constructor" << endl; }
4         ~Singlton() { cout << "Singleton::destructor" << endl; }
5         Singleton(const Singleton&) {};
6         Singleton &operator=(const Singleton&) {};
7     public:
8         static Singleton* getInstance() {
9             if(m_aInstance == NULL) {
10                 m_aInstance = new Singleton();
11             }
12             return m_aInstance;
13         }
14         void show() {
15             cout << "Singleton::show" << endl;
16         }
17     private:
18         static Singleton* m_aInstance;
19 };
20  
21 Singleton* Singleton::m_aInstance = NULL;
22  
23 int main(int argc, char **argv) {
24     Singleton* aSingleton = Singleton::getInstance();
25     aSingleton->show();
26     return 0;
27 }
编译执行上面的代码,输出如下:

 

Singleton::constructor
Singleton::show
我们发现上面的输出并没有调用到Singleton的虚构函数,Singleton的资源可能没有被释放。现在的问题是要怎么才能在程序退出的时候正确释放Singleton的资源。我们注意到这样一个事实:

 

系统会自动调用在栈和静态数据区上分配的对象的析构函数来释放资源。

修改程序如下:

1 class Singleton {
2     private:
3         Singleton() { cout << "Singleton::constructor" << endl; }
4         ~Singleton() { cout << "Singleton::destructor" << endl; }
5         Singleton(const Singleton&) {};
6         Singleton &operator=(const Singleton&) {};
7     public:
8         static Singleton* getInstance() {
9             if(m_aInstance == NULL) {
10                 m_aInstance = new Singleton();
11             }
12             return m_aInstance;
13         }
14         void show() {
15             cout << "Singleton::show" << endl;
16         }
17  
18     private:
19         class Garbage{
20             public:
21                 ~Garbage() {
22                     if(m_aInstance != NULL) {
23                         delete m_aInstance;
24                     }
25                 }
26         };
27      
28     private:
29         static Singleton* m_aInstance;
30         static Garbage m_garbage;
31 };
32  
33 Singleton* Singleton::m_aInstance = NULL;
34 Singleton::Garbage Singleton::m_garbage;
35  
36 int main(int argc, char **argv) {
37     Singleton* aSingleton = Singleton::getInstance();
38     aSingleton->show();
39     return 0;
40 }
编译上面的代码并执行,输出如下:

 

Singleton::constructor
Singleton::show
Singleton::destructor

我们看到Singleton::destructor被明确的执行了。

相关阅读:  递归模板实现单例模式
目录
相关文章
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
245 0
|
设计模式 安全 测试技术
【C++】—— 单例模式详解
【C++】—— 单例模式详解
185 0
C++实现单例模式-多种方式比较
单例模式,面试中经常被问到,但是很多人只会最简单的单例模型,可能连多线程都没考虑到,本文章从最简单的单例,到认为是最佳的单例模式实现方式,单例模式没有什么知识点,直接上源码
220 0
|
6月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
124 16
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
105 0
|
11月前
|
C++
C++单例模式
C++中使用模板实现单例模式的方法,并通过一个具体的类A示例展示了如何创建和使用单例。
75 2
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
193 2
|
安全 C++
C++ QT 单例模式
C++ QT 单例模式
293 0
|
设计模式 安全 IDE
C++从静态类型到单例模式
C++从静态类型到单例模式
103 0
|
设计模式 存储 缓存
C++ -- 单例模式
**摘要:** 单例模式确保一个类仅有一个实例,并提供全局访问点。为了实现单例,构造函数通常设为私有,通过静态成员函数来创建和返回实例。两种常见实现是饿汉模式(在类加载时创建实例,线程安全但可能导致不必要的内存占用)和懒汉模式(首次使用时创建,可能需线程同步)。拷贝构造函数和赋值运算符通常被禁用来防止额外实例的创建。单例模式适用于资源管理、缓存和线程池等场景。在C++中,静态成员变量和函数用于存储和访问单例实例,保证其生命周期与程序相同。