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