很久遠以前,丹尼斯.裡奇發明了C語言,這個語言有一個優點,就是可以動態地分配內存。當需要使用內存時,就可以立即向系統申請。當不需要時,又可以立即釋放回給系統,再給別的程序使用。這種動態的內存管理,使得當時以K計算的內存時代,也可以處理很大數據量的軟件出現。但這中使用函數malloc來分配內存,使用函數free來釋放內存的機制,一直到今天,還在使用。不過,這種方式有一個缺點,就是當你不斷地使用函數malloc來分配內存,而忘記使用free函數來釋放內存時,就會導致系統裡的內存一點一點地變少了。 回想到初入軟件開發時,對這點沒有足夠的理解,就發生了這樣一件奇怪的事情。當時,我的上司叫我開發一個股票信息上傳軟件,這個軟件有一個特點:一天24小時,連續運行1年,都不關閉。當這個軟件上線時,就會發現前一個星期運行很正常,一個星期後發現系統奇慢無比,再查看內存,已經占用很大,沒有內存可以使用了。再使用查看內存工具查看上傳股票信息軟件,居然占了絕大部份內存。這時才發現內存有洩漏,立即打開代碼查找,足足找了一個星期才完全解決。發現一些地方分配了內存,在某種條件下,不再釋放這部分內存。自從有了這次經歷之後,都會在分配內存代碼之後,就立即編寫釋放內存的代碼。因此內存管理就提到編程思想裡的首要地位,否則開發出來的軟件說不定那天又死了,又給客戶投訴。後來進入C++的開發時代,內存分配變成new和delete的操作,也提供了構造函數和析構函數,這樣更進一步對內存管理的自動化,雖然這樣比C語言時代提高了不少方便之處。但在C++裡還有很多函數裡分配的資源,在某些地方直接返回,忘記刪除內存了,這時又有內存洩漏了。如下面的例子:www.2cto.com [cpp] voidTest(void) { int* nVal = new int; if (*nVal > 0) { return; } delete nVal; } 上面的例子,只是幾行代碼,當然不會忘記的,但寫一個函數的代碼,往往有200行以上,更有人把函數的代碼寫到1000行或2000行以上,也大有人在。在這種情況之下,往往會忘記刪除內存,導致洩漏出現了。 面對內存丟失的高風險,軟件長時間運行不穩定而難以根除,軟件的代碼量又越來越大的今天,在C++的世界裡急需尋找一個方案來解決這個問題,否則軟件的開發成本會越來越高,軟件發布的日期一推再推。有些開發人員,已經等不及這個方案出現,就轉向了不用內存管理的語言世界,比如JAVA、C#,因為這些語言都是帶有垃圾回收的機制,不再用軟件開發人員去參與內存管理了。但這些語言是以降低軟件運行性能為代價的,因為垃圾回收時,所有對象都不能運行,需要等到內存回收之後,才能運行。此外,垃圾的統計和標記,也增加了很大開銷,導致系統變慢。 在C++的世界裡,還有沒有更好的方案來解決這個問題呢?答案是會有的,它既不引入垃圾回收的機制,也不會增加太多資源上的負擔。在STL庫裡,為此引入了std::auto_ptr,這就是智能指針。