天天看點

C++: 單例模式和缺陷

C++: 單例模式和缺陷

實作一個單例模式

<code>1</code>

<code>class</code> <code>Singleton {</code>

<code>2</code>

<code>    </code><code>private</code><code>:</code>

<code>3</code>

<code>        </code><code>Singleton() { cout &lt;&lt;</code><code>"Singleton::constructor"</code> <code>&lt;&lt; endl; }</code>

<code>4</code>

<code>        </code><code>~Singlton() { cout &lt;&lt;</code><code>"Singleton::destructor"</code> <code>&lt;&lt; endl; }</code>

<code>5</code>

<code>        </code><code>Singleton(</code><code>const</code> <code>Singleton&amp;) {};</code>

<code>6</code>

<code>        </code><code>Singleton &amp;operator=(</code><code>const</code> <code>Singleton&amp;) {};</code>

<code>7</code>

<code>    </code><code>public</code><code>:</code>

<code>8</code>

<code>        </code><code>static</code> <code>Singleton* getInstance() {</code>

<code>9</code>

<code>            </code><code>if</code><code>(m_aInstance == NULL) {</code>

<code>10</code>

<code>                </code><code>m_aInstance =</code><code>new</code> <code>Singleton();</code>

<code>11</code>

<code>            </code><code>}</code>

<code>12</code>

<code>            </code><code>return</code> <code>m_aInstance;</code>

<code>13</code>

<code>        </code><code>}</code>

<code>14</code>

<code>        </code><code>void</code> <code>show() {</code>

<code>15</code>

<code>            </code><code>cout &lt;&lt;</code><code>"Singleton::show"</code> <code>&lt;&lt; endl;</code>

<code>16</code>

<code>17</code>

<code>18</code>

<code>        </code><code>static</code> <code>Singleton* m_aInstance;</code>

<code>19</code>

<code>};</code>

<code>20</code>

<code>21</code>

<code>Singleton* Singleton::m_aInstance = NULL;</code>

<code>22</code>

<code>23</code>

<code>int</code> <code>main(</code><code>int</code> <code>argc,</code><code>char</code> <code>**argv) {</code>

<code>24</code>

<code>    </code><code>Singleton* aSingleton = Singleton::getInstance();</code>

<code>25</code>

<code>    </code><code>aSingleton-&gt;show();</code>

<code>26</code>

<code>    </code><code>return</code> <code>0;</code>

<code>27</code>

<code>}</code>

編譯執行上面的代碼,輸出如下:

我們發現上面的輸出并沒有調用到Singleton的虛構函數,Singleton的資源可能沒有被釋放。現在的問題是要怎麼才能在程式退出的時候正确釋放Singleton的資源。我們注意到這樣一個事實:

修改程式如下:

<code>        </code><code>~Singleton() { cout &lt;&lt;</code><code>"Singleton::destructor"</code> <code>&lt;&lt; endl; }</code>

<code>        </code><code>class</code> <code>Garbage{</code>

<code>            </code><code>public</code><code>:</code>

<code>                </code><code>~Garbage() {</code>

<code>                    </code><code>if</code><code>(m_aInstance != NULL) {</code>

<code>                        </code><code>delete</code> <code>m_aInstance;</code>

<code>                    </code><code>}</code>

<code>                </code><code>}</code>

<code>        </code><code>};</code>

<code>    </code> 

<code>28</code>

<code>29</code>

<code>30</code>

<code>        </code><code>static</code> <code>Garbage m_garbage;</code>

<code>31</code>

<code>32</code>

<code>33</code>

<code>34</code>

<code>Singleton::Garbage Singleton::m_garbage;</code>

<code>35</code>

<code>36</code>

<code>37</code>

<code>38</code>

<code>39</code>

<code>40</code>

編譯上面的代碼并執行,輸出如下:

我們看到Singleton::destructor被明确的執行了。

相關閱讀: 遞歸模闆實作單例模式

繼續閱讀