淺談C++中的那些內存泄露


     盡管學過C語言。可是C++里面的一些基礎還是不太懂,還須要再掌握。

老范也開始要講C++設計模式了,必須快點看了。不然就要白花窩滴錢了。

     對於內存泄露,我的個人理解就是程序在執行過程中,自己開辟了空間,用完這塊空間后卻沒有釋放。

今晚上我就犯了這種低級錯誤,導致程序沒有執行出來。還是先看代碼:

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
class person{
	public:
		person(){
			cout<<"基類構造函數運行中.....\n";
		}
	       ~person(){
			cout<<"基類析構函數運行中.....\n";
		}
}; 
class DS:public person{
	public:
		DS(){
			cout<<"派生類構造函數運行中.....\n";
		}
		~DS(){
			cout<<"派生類析構函數運行中.....\n";
		}
};
int main(int argc, char** argv) {
	
	DS p;
	return 0;
}

這段代碼是沒有問題的,程序開始從main函數執行,實例化派生類DS一個對象p。無論怎樣。派生類DS總先調用基類person的構造函數,然后派生類DS在調用自己的構造函數,接着是自己的析構函數,最后是基類person的構造函數,執行結果例如以下圖所看到的:

事實上嘛,這個什么時候調基類構造(析構)。什么時候調派生類構造(析構)。我個人的理解能夠用簡單的圖來表示了。基類構造和析構就像一個大框架包括着派生類的構造和析構:

 

1. 對於上述的程序我在main函數中繼續改動,假設new了。卻沒delete。(用匹配和兼容任意,結果還是一樣的)

int main(int argc, char** argv) {
	

	DS *p=new DS();
        // person *p= new DS();
	return 0;
}

這時候就出現故障了,假設在C++中。就會出現以下的結果:


原因是new了,卻不沒delete,造成內存泄露。在程序執行過程中析構函數是不會調用的,直到整個程序結束。系統才會自己主動釋放內存。

2. 對於上述的程序我在main函數中繼續改動,這次加上delete p,如今匹配的情況下操作。也就是派生類的指針指向派生對象:

int main(int argc, char** argv) {
	

	DS *p=new DS();
	 delete  p;
	return 0;
}


執行結果大家也應該猜的出來,4個全有

 

3. 對於上述的程序我在main函數中繼續改動,這次利用兼容,即就是基類指針指向派生類的對象:

<strong>int main(int argc, char** argv) {
	

	 person *p=new DS();
	 delete  p;
	return 0;
}</strong>

 

可是這次又出現故障了,執行結果中沒有派生類的析構函數,這都是兼容惹的禍,由於基類指針僅僅能指向派生類繼承自己的那一部分,對於派生類DS那一部分,基類指針映射不到。所以就不去調用它,演示結果例如以下:

要解決這問題實際不難。這個時候就要。基類指針就基類指針,管他三七二十一的。我這個時候僅僅要在基類person的析構函數中加一個virtual(虛特性)。盡管在main函數中,還是第三中情況。我也能夠輕輕松松的輸出以下的結果:

事實上這個里面涉及到了。繼承(兼容規則),多態的知識,在C++涉及模式中,95%都用到了多態性,無疑這是C++的重點,一定要好好學習這一塊。

對於繼承和多態的相關知識下一個博客在說吧,那個就要大寫特寫了,,哈哈,那是一個非常有意思的舉例——媳婦炒菜,工廠模式,慢慢的就進入C++的核心中去了。。

接下來。關於C++中,指針delete刪除值得問題。這一塊有必要說一下:

先把代碼發上去在說吧

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv) {
	int *p;
	p=new int;
	*p=3;
     cout<<"輸出值*p= "<<*p<<endl;
     cout<<"輸出地址p= "<<p<<endl;
     
     delete p;   //delete p 之后 
	 
     cout<<"delete p 之后輸出值*p= "<<*p<<endl;
     cout<<"delete p 之后輸出地址p= "<<p<<endl;
     
     	  
     
	return 0;
}


我定義了一個整型指針p。new了一塊int型的整型單元,並給*p賦值3,之后呢,輸出*p和p的地址。之后我在delete p。事實上我們每次delete實際上是刪除的是p指向那塊空間的值。並沒有刪除它的地址,因此才會出現以下的結果演示:

好了,我的能力有限就僅僅能寫到這里了,以后遇到問題在完好,不正確的地方也要改動。,睡覺了,,。瞌睡死了,。,,

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM