C++: 单例模式和缺陷
睿丰德科技 专注RFID识别技术和条码识别技术与管理软件的集成项目。质量追溯系统、MES系统、金蝶与条码系统对接、用友与条码系统对接
编译执行上面的代码,输出如下:
编译上面的代码并执行,输出如下:
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被明确的执行了。
相关阅读: 递归模板实现单例模式 RFID管理系统集成商 RFID中间件 条码系统中间层 物联网软件集成