從預設解構函式學習c++,new,delete,記憶體洩漏,野指標

帥氣的濤啊發表於2019-06-11

預設解構函式:
當系統沒有顯式定義解構函式,編譯器同樣會為物件定義一個預設解構函式,預設的解構函式只能釋放普通資料成員所佔用的空間,無法通過釋放通過new和malloc進行申請的空間,因此避免記憶體洩漏,我們要顯式的解構函式對申請的空間釋放。

記憶體洩漏(Memory Leak)是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。

動態分配記憶體:
new是C++中用於動態記憶體分配的運算子,在C語言中一般使用malloc函式。

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

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

 

野指標指向一個已刪除的物件或未申請訪問受限記憶體區域的指標。與空指標不同,野指標無法通過簡單地判斷是否為 NULL避免,而只能通過養成良好的程式設計習慣來盡力減少。對野指標進行操作很容易造成程式錯誤。需對指標進行初始化,有時指標在free或delete後未賦值 NULL,便會使人以為是合法的。別看free和delete的名字(尤其是delete),它們只是把指標所指的記憶體給釋放掉,但並沒有把指標本身幹掉。此時指標指向的就是“垃圾”記憶體。釋放後的指標應立即將指標置為NULL,防止產生“野指標”。

野指標主要是因為這些疏忽而出現的刪除或申請訪問受限記憶體區域的指標。

 

new開闢空間分為倆種情況:

開闢單變數地址空間:

int *a=new int       //定義一個int型別的指標。

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

釋放:        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的空間

 

 

 

如果函式的形參是類的物件,則在進行函式呼叫時,將自動呼叫複製建構函式,這也是複製建構函式中的形參如果不是物件引用會造成無限迴圈呼叫的原因。。。。。。。未完待續。

相關文章