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

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