盡管學過C語言。可是C++里面的一些基礎還是不太懂,還須要再掌握。
對於內存泄露,我的個人理解就是程序在執行過程中,自己開辟了空間,用完這塊空間后卻沒有釋放。
今晚上我就犯了這種低級錯誤,導致程序沒有執行出來。還是先看代碼:
1 #include <iostream> 2 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 4 using namespace std; 5 class person{ 6 public: 7 person(){ 8 cout<<"基類構造函數運行中.....\n"; 9 } 10 ~person(){ 11 cout<<"基類析構函數運行中.....\n"; 12 } 13 }; 14 class DS:public person{ 15 public: 16 DS(){ 17 cout<<"派生類構造函數運行中.....\n"; 18 } 19 ~DS(){ 20 cout<<"派生類析構函數運行中.....\n"; 21 } 22 }; 23 int main(int argc, char** argv) { 24 25 DS p; 26 return 0; 27 }
這段代碼是沒有問題的,程序開始從main函數執行,實例化派生類DS一個對象p。無論怎樣。派生類DS總先調用基類person的構造函數,然后派生類DS在調用自己的構造函數,接着是自己的析構函數,最后是基類person的構造函數,執行結果例如以下圖所看到的:
事實上嘛,這個什么時候調基類構造(析構)。什么時候調派生類構造(析構)。我個人的理解能夠用簡單的圖來表示了。基類構造和析構就像一個大框架包括着派生類的構造和析構:
1. 對於上述的程序我在main函數中繼續改動,假設new了。卻沒delete。(用匹配和兼容任意,結果還是一樣的)
1 int main(int argc, char** argv) { 2 3 4 DS *p=new DS(); 5 // person *p= new DS(); 6 return 0; 7 }
這時候就出現故障了,假設在C++中。就會出現以下的結果:
原因是new了,卻不沒delete,造成內存泄露。在程序執行過程中析構函數是不會調用的,直到整個程序結束。系統才會自己主動釋放內存。
2. 對於上述的程序我在main函數中繼續改動,這次加上delete p,如今匹配的情況下操作。也就是派生類的指針指向派生對象:
1 int main(int argc, char** argv) { 2 3 4 DS *p=new DS(); 5 delete p; 6 return 0; 7 }
執行結果大家也應該猜的出來,4個全有
3. 對於上述的程序我在main函數中繼續改動,這次利用兼容,即就是基類指針指向派生類的對象:
1 <strong>int main(int argc, char** argv) { 2 3 4 person *p=new DS(); 5 delete p; 6 return 0; 7 }</strong>
可是這次又出現故障了,執行結果中沒有派生類的析構函數,這都是兼容惹的禍,由於基類指針僅僅能指向派生類繼承自己的那一部分,對於派生類DS那一部分,基類指針映射不到。所以就不去調用它,演示結果例如以下:
要解決這問題實際不難。這個時候就要。基類指針就基類指針,管他三七二十一的。我這個時候僅僅要在基類person的析構函數中加一個virtual(虛特性)。盡管在main函數中,還是第三中情況。我也能夠輕輕松松的輸出以下的結果:
事實上這個里面涉及到了。繼承(兼容規則),多態的知識,在C++涉及模式中,95%都用到了多態性,無疑這是C++的重點,一定要好好學習這一塊。
對於繼承和多態的相關知識下一個博客在說吧,那個就要大寫特寫了,,哈哈,那是一個非常有意思的舉例——媳婦炒菜,工廠模式,慢慢的就進入C++的核心中去了。。
接下來。關於C++中,指針delete刪除值得問題。這一塊有必要說一下:
先把代碼發上去在說吧
1 #include <iostream> 2 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 4 using namespace std; 5 int main(int argc, char** argv) { 6 int *p; 7 p=new int; 8 *p=3; 9 cout<<"輸出值*p= "<<*p<<endl; 10 cout<<"輸出地址p= "<<p<<endl; 11 12 delete p; //delete p 之后 13 14 cout<<"delete p 之后輸出值*p= "<<*p<<endl; 15 cout<<"delete p 之后輸出地址p= "<<p<<endl; 16 17 18 19 return 0; 20 }
我定義了一個整型指針p。new了一塊int型的整型單元,並給*p賦值3,之后呢,輸出*p和p的地址。之后我在delete p。事實上我們每次delete實際上是刪除的是p指向那塊空間的值。並沒有刪除它的地址,因此才會出現以下的結果演示:
好了,我的能力有限就僅僅能寫到這里了,以后遇到問題在完好,不正確的地方也要改動。,睡覺了,,。瞌睡死了,。,,