new出來的空間如果沒有主動銷毀,在程序退出時仍可能有內存的泄露。
操作系統描述到,在進程退出時會銷毀它所使用的所有內存空間,但這只是
一個模型上的構想和描述。在實際的操作系統的實現上并不能做到這一點。
因為,要實現在進程退出時銷毀它所使用的內存空間,就要給每個被使用的
內存空間打一個標,表示這段內存空間被那個進程使用。在這種情況下,如
果有多個使用小內存量的進程,并且被頻繁的創建和銷毀,那么光記住那些
進程標致就要占用很大的內存空間,這是一個很不劃算的方案。所以在實際
中,操作系統并沒有給每個進程使用的內存空間打標。這樣,有些小內存是
沒有被回收的,如果多次開關這個程序就會發現,有內存被大量的占用,而
不能被釋放。
所以那些在程序中只有一個實例,并且是被new出來的對象,也應該主動
的去手動銷毀,而不能依賴程序退出時由系統銷毀。
被new出來的對象其銷毀是兩個步驟。
1 析構對象。條用對象的析構函數,將對象占用的資源釋放掉。
2 釋放內存。將對象所占用的內存釋放掉。
如果new出來的對象沒有被銷毀,會造成連個層面上的泄露。
1 對象泄露。他會造成背對象占用的資源也沒有銷毀或釋放。比如在對象
中占有文件的句柄,在析構時才釋放。如果對象泄露了,這個句柄是不會被釋
放的。那個文件會一直被占用。如果文件打開時是獨占的,那么及時對象所在
的程序退出了,別的程序也別想訪問這個文件。
2 內存泄露。所占用的內存不能被釋放。
posted on 2007-05-31 10:50
walkspeed 閱讀(2706)
評論(5) 編輯 收藏 引用 所屬分類:
C++語言