默認析構函數:
當系統沒有顯式定義析構函數,編譯器同樣會為對象定義一個默認析構函數,默認的析構函數只能釋放普通數據成員所占用的空間,無法通過釋放通過new和malloc進行申請的空間,因此避免內存泄漏,我們要顯式的析構函數對申請的空間釋放。
內存泄漏(Memory Leak)是指程序中己動態分配的堆內存由於某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重后果。
動態分配內存:
new是C++中用於動態內存分配的運算符,在C語言中一般使用malloc函數。
(new后時候最好判斷是不是分配成功,防止野指針!!(野指針是什么??你是不是想問?不告訴你))
int *p= new int; if(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的空間
如果函數的形參是類的對象,則在進行函數調用時,將自動調用復制構造函數,這也是復制構造函數中的形參如果不是對象引用會造成無限循環調用的原因
例如:X a(b)按值傳遞時,用X類的對象b初始化X類對象的a,會引起拷貝構造函數得調用,在調用X a(X obj)時,按值傳遞實參b初始化obj時又要調用拷貝構造函數造成了,X(X)的無限循環。
假如:X a(b)按引用傳遞時,用X類的對象b初始化X類對象的a,會引起拷貝構造函數得調用,在調用 X a(X &obj)時,obj就是b的別名,不會引起拷貝構造函數的調用。