標籤:映射 故障 函數 fonts iss 那是 記憶體 能力 意思
點擊閱讀原文
儘管學過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指向那塊空間的值。並沒有刪除它的地址,因此才會出現以下的結果示範:
好了,我的能力有限就僅僅能寫到這裡了,以後遇到問題在完好,不正確的地方也要改動。,睡覺了,,。瞌睡死了,。,,
[轉] 淺談C++中的那些記憶體泄露