從默認析構函數學習c++,new,delete,內存泄漏,野指針

默認析構函數:
當系統沒有顯式定義析構函數,編譯器一樣會爲對象定義一個默認析構函數,默認的析構函數只能釋放普通數據成員所佔用的空間,沒法經過釋放經過new和malloc進行申請的空間,所以避免內存泄漏,咱們要顯式的析構函數對申請的空間釋放。編程

內存泄漏(Memory Leak)是指程序中己動態分配的堆內存因爲某種緣由程序未釋放或沒法釋放,形成系統內存的浪費,致使程序運行速度減慢甚至系統崩潰等嚴重後果。數組

動態分配內存:
new是C++中用於動態內存分配的運算符,在C語言中通常使用malloc函數。函數

(new後時候最好判斷是否是分配成功,防止野指針!!(野指針是什麼??你是否是想問?不告訴你))spa

int *p= new intif(p==NULL)
{
cout<<"沒有分配成功還操做你媽呢!"<<endl;
exit(0);
}

 

野指針指向一個已刪除的對象或未申請訪問受限內存區域的指針。與空指針不一樣,野指針沒法經過簡單地判斷是否爲 NULL避免,而只能經過養成良好的編程習慣來盡力減小。對野指針進行操做很容易形成程序錯誤。需對指針進行初始化,有時指針在free或delete後未賦值 NULL,便會令人覺得是合法的。別看free和delete的名字(尤爲是delete),它們只是把指針所指的內存給釋放掉,但並無把指針自己幹掉。此時指針指向的就是「垃圾」內存。釋放後的指針應當即將指針置爲NULL,防止產生「野指針」。指針

野指針主要是由於這些疏忽而出現的刪除或申請訪問受限內存區域的指針。code

 

new開闢空間分爲倆種狀況:對象

開闢單變量地址空間:blog

int *a=new int       //定義一個int類型的指針。內存

int *a=new int(3)   //定義一個int類型指針並賦予初值3。get

釋放:        delete a;

開闢數組空間:

int *a=new int[5]   //定義一個int類型長度爲5的數組並把地址賦給a指針。(注意‘[]’與‘()’的區別) 

釋放:        delete []a;   

 

你new的時候加'[]'釋放也加‘[]’,你new的時候沒加釋放也不用加(前面的確定正確),有時候你new的時候加了‘[]’釋放也能夠不加,如今我還沒明白。

 

釋放完成後須要把指針置爲空,防止野指針。a=null;

 

 

其實指針數組與普通數組很類似

好比定義數組  a[5],*p;
數組有個首地址,
訪問數組就是經過首地址來訪問。
*P指針指向數組就是指向首地址。
數組能夠的用a[n]訪問第n+1的空間
指針也能夠用*p[n]訪問第n+1的空間

 

 

 

若是函數的形參是類的對象,則在進行函數調用時,將自動調用複製構造函數,這也是複製構造函數中的形參若是不是對象引用會形成無限循環調用的緣由。。。。。。。未完待續。

相關文章
相關標籤/搜索