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 <<</code><code>"Singleton::constructor"</code> <code><< endl; }</code>
<code>4</code>
<code> </code><code>~Singlton() { cout <<</code><code>"Singleton::destructor"</code> <code><< endl; }</code>
<code>5</code>
<code> </code><code>Singleton(</code><code>const</code> <code>Singleton&) {};</code>
<code>6</code>
<code> </code><code>Singleton &operator=(</code><code>const</code> <code>Singleton&) {};</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 <<</code><code>"Singleton::show"</code> <code><< 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->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 <<</code><code>"Singleton::destructor"</code> <code><< 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被明确的執行了。
相關閱讀: 遞歸模闆實作單例模式