Singleton模式——C++應(yīng)用(四)
在前面的例子中,我們看到:采用 new 來為單件對象分配空間,如果采用手動調(diào)用 delete 或封裝了 delete 的 Release 操作,一旦遇到全局對象的析構(gòu)有調(diào)用單件對象,就會使得無法在代碼中找到適合釋放單件對象的時機。那么,是否可以讓系統(tǒng)來自動選擇時機,調(diào)用釋放呢?如果可以,又該怎么在代碼中構(gòu)建單件對象的自動釋放機制呢? 對這兩個問題,在進(jìn)行了一番思考和嘗試后,終于找到了答案 —— 內(nèi)建只有一個析構(gòu)方法的結(jié)構(gòu)體,定義一個靜態(tài)的該結(jié)構(gòu)體的變量,并在結(jié)構(gòu)體的析構(gòu)中釋放單件對象。下文將就此給出 Demo,還望有高手能給出更好的方案。(從前面內(nèi)容,我們已經(jīng)知道,單件對象的指針通過靜態(tài)類成員變量進(jìn)行存儲,并通過 new 分配的方式,存在在著線程安全的問題。同理,下面Demo的單件類A在多線程環(huán)境使用時,自然也存在線程安全的問題。)
Demo代碼如下:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

運行后的結(jié)果:
綜合Demo代碼和運行結(jié)果,我們可以看到,對于單件類A的對象釋放者采用了類的靜態(tài)成員的方式來定義,其結(jié)果是,單件類A的對象釋放時機仍然不對。
再看C,代碼中new 所得的對象指針交由一局部靜態(tài)變量以保證 new 只會執(zhí)行一次(從而保證了線程安全), 而單件對象的釋放者就定義在緊挨 new 的前面(事實上,也可以定義在緊挨 new 的后面)。接著是執(zhí)行結(jié)果,完全OK! 哈哈~,值得推薦的第二種C++單件類構(gòu)建模式終于也出爐了,那就是上例Demo中,單件類C的構(gòu)建模式。
至此,《Singleton模式——C++應(yīng)用》全部完成,因為還是第一次寫技術(shù)博客,寫得不好,還請各位看官見諒!
嗯~,突然發(fā)現(xiàn),我漏寫了對這全部四篇內(nèi)容的一個總結(jié),……還是算了,就請各位原諒我這次的偷懶咯!~
posted on 2012-03-14 01:07 青碧竹 閱讀(348) 評論(0) 編輯 收藏 引用 所屬分類: 設(shè)計模式