內存泄漏概念:內存泄漏時指動態申請的內存空間沒有正常釋放,但是也不能繼續使用的情況。
例如:
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.
- 指針操作超越了變量的作用范圍,比如返回指向棧內存的指針就是野指針。
內存泄漏危害:
從用戶使用程序的角度來看,內存泄漏本身不會產生什么危害。作為一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終消耗盡系統所有的內存。從這個角度來說,一次性內存泄漏並沒有什么危害,因為它不會堆積。而隱式內存泄漏危害性則非常大,因為較之於常發性和偶發性內存泄漏它更難被檢測到。存在內存泄漏問題的程序除了會占用更多的內存外,還會使程序的性能急劇下降。對於服務器而言,如果出現這種情況,即使系統不崩潰,也會嚴重影響使用。
不過還有一點,如果你的程序內存泄露正好寫到了系統使用的內存或者其他程序使用的內存地址,那么就會導致系統異常或者程序崩潰