[轉] 淺談C++中的那些記憶體泄露

來源:互聯網
上載者:User

標籤:映射   故障   函數   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++中的那些記憶體泄露

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.