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


點擊閱讀原文

 

     盡管學過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指向那塊空間的值。並沒有刪除它的地址,因此才會出現以下的結果演示:

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


免責聲明!

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



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