記憶體洩漏概念:記憶體洩漏時指動態申請的記憶體空間沒有正常釋放,但是也不能繼續使用的情況。
例如:
char *ch1;ch1 = new
char('a'
);char = *ch2 = new
char
;ch1 =ch2;
程式執行後,指標ch1和ch2指向同乙個位址單元,而原來的ch1所申請的存放字元a的空間就不可能再使用,產生了記憶體洩漏。
最常出現的情況是申請了動態記憶體後,沒有正常的使用delete來釋放,導致記憶體洩漏。
1.當基類指標指向子類物件即在子類中動態申請記憶體時,如果基類的析構函式不是virtual,那麼子類的析構函式將不會被呼叫,子類的資源沒有正確是釋放,因此造成記憶體洩露
例如:
char *ch1, *ch2;ch1 = new
char
;ch2 =ch1;
*ch2 = 'b'
;delete ch1;
程式執行到這裡,指標ch2就是指向了乙個已經釋放的位址空間,形成指標懸掛。
如果還要用delete ch2 來釋放ch2的空間,就會出現執行錯誤,因為實際上不存在可以釋放的空間。
野指標:指向被釋放的或者訪問受限記憶體的指標。
造成野指標的原因:
指標變數沒有被初始化(如果值不定,可以初始化為null)
指標被free或者delete後,沒有置為null, free和delete只是把指標所指向的記憶體給釋放掉,並沒有把指標本身乾掉,此時指標指向的是「垃圾」記憶體。釋放後的指標應該被置為null.
指標操作超越了變數的作用範圍,比如返回指向棧記憶體的指標就是野指標。
記憶體洩漏危害:
從使用者使用程式的角度來看,記憶體洩漏本身不會產生什麼危害。作為一般的使用者,根本感覺不到記憶體洩漏的存在。真正有危害的是記憶體洩漏的堆積,這會最終消耗盡系統所有的記憶體。從這個角度來說,一次性記憶體洩漏並沒有什麼危害,因為它不會堆積。而隱式記憶體洩漏危害性則非常大,因為較之於常發性和偶發性記憶體洩漏它更難被檢測到。存在記憶體洩漏問題的程式除了會占用更多的記憶體外,還會使程式的效能急劇下降。對於伺服器而言,如果出現這種情況,即使系統不崩潰,也會嚴重影響使用。
不過還有一點,如果你的程式記憶體洩露正好寫到了系統使用的記憶體或者其他程式使用的記憶體位址,那麼就會導致系統異常或者程式崩潰
懸掛指標與野指標
owed by 春夜喜雨 懸掛指標 dangling pointers 迷途指標 懸垂指標 野指標 wild pointers 懸掛指標是由於 指標的指向記憶體被刪除導致 例子1 退出if的範圍之後,c變數不再存在,p指向的位址被作業系統 了。指標被懸掛了,後續如果再被使用就會有問題。int p n...
什麼是記憶體洩漏?野指標?懸掛指標?空指標異常?
1.q 什麼是記憶體洩漏?a 用動態儲存分配函式動態開闢的控制項,在使用完畢後沒有釋放,結果導致一直佔據該記憶體單元,直到程式結束,稱為記憶體洩漏。2.q 什麼是野指標?成因 1 指標變數沒有初始化 2 指標被free delete後,沒置null 3 不要返回指向棧記憶體的指標或引用,因為棧內存在...
記憶體洩漏與野指標
當你要為變數a申請一塊記憶體空間的時候,需要用到malloc函式。如何申請這塊記憶體空間呢?這就變成程式的工作了。程式首先會向系統申請一塊記憶體空間,然後程式會把申請好的這塊記憶體空間的首位址賦給變數a,假設這時候變數a拿到的首位址為0x1234,如果我們現在要對變數a進行迴圈操作,那麼每迴圈一次,...