使用關鍵字new動態分配記憶體,在new後面為其分配記憶體物件的型別,讓編譯器知道需要多少記憶體。new的返回值是乙個記憶體位址,記憶體的位址被儲存在指標中,因此將new的返回值賦給乙個指標。如
shortint*p;
p = new
short
int;
或者宣告指標的同時直接初始化,
shortint* p= new
short
int;
無論用哪種方式,p都指向了short int,然後就可以向變數的指標那樣使用如
*p = 72; //將72放在動態記憶體中
使用完了指標記得一定要釋放指標。可以用delete釋放記憶體。
如果用new分配記憶體,系統不會自動釋放記憶體,所以我們必須要用delete是否記憶體。如果沒有釋放掉,那麼這塊記憶體就變得不可用。這叫記憶體洩漏。釋放記憶體如:
delete p;
刪除指標,也就釋放了指標中的記憶體,相等於把指標指向的記憶體區域釋放掉。該指標仍然存在。可以重新給它賦值。示例:在堆中給變數分配記憶體。使用後並刪除它。
int*p = newint;
delete p; //
刪除指標
p = 0; //
將指標設為0
delete p; //
程式崩潰
使用new分配記憶體,使用和刪除指標示例
int i = 5;
int* p = &i;
int* p1 = new
int;
*p1 = 6;
cout
<<"i="
cout
<<"
*p="
<<*p
<<"
*p1=
"<<*p1
p1 = new
int;
*p1 = 7;
cout
<<"
*p1=
"<<*p1
getchar();
return
0;
輸出結果為:
i = 5
*p = 6
*p1 = 6
*p1 = 7
我們可以在堆中建立物件,就像建立指標一樣,它可以指向任何型別,包括類物件。如
定義乙個person類,可以宣告乙個指向person類的指標,並在堆中例項化乙個person物件
如 person* p = new person;
當呼叫預設的建構函式,系統自動建立預設的建構函式,無論是在堆中還是在棧中建立都將呼叫預設的建構函式。然而,需要注意的是,使用new建立物件是,不僅可以使用預設的建構函式,也可以使用任何建構函式。
用delecte刪除物件的指標時,釋放記憶體之前呼叫物件的析構函式。這也就意味著讓類指向了清理的工作。通常是從堆中分配而來的。就像從堆中刪除物件一樣。
示例 從堆中建立和刪除物件
classperson
;person::person()
person::~person()
intmain()
輸出結果
建立乙個物件p
構造函式呼叫
new乙個物件p1
構造函式呼叫
刪除p1
構造函式呼叫
從上結論可以得出,無論是從堆中還是在棧中,系統都預設呼叫建構函式被呼叫。在堆中建立物件的時候,系統自動呼叫預設的建構函式。在刪除指標p1時,導致析構函式自動被呼叫,同時分配p1的物件記憶體被釋放。
詳解C 之this指標
this指標,存在於類的非靜態成員函式中,是編譯器給成員函式預設的隱藏的乙個指標。當該函式被某乙個物件呼叫時,該指標指向成員函式的主調物件 保留了該主調物件的記憶體位址 本類物件的指標 問 乙個物件的引用或物件當做函式引數?本人面試曾被問過,答的不太好,進行了總結,希望來者避坑 答 在類的靜態成員函...
C 之this指標詳解
this指標 每個成員函式 包括構造和析構 都有乙個this指標。this指標指向呼叫物件,即可以通過this關鍵字訪問物件成員。訪問成員變數 this 成員名 訪問成員函式 this 函式名 注意 1.this指標的型別為類型別 const 類名 const 為右值。2.this指標本身不占用大小...
C語言 指標篇(二)陣列指標
先介紹一下概念 陣列指標,表示指向陣列的指標,或者說指標指向的是陣列!先上 int main 首先,我們定義乙個二維陣列,m是二維陣列的陣列名,也是陣列的首位址,相當於二級指標常量。p是個指標變數,指向乙個包含2個元素的一維陣列,且p的增量以它所指向的一維陣列的長度為單位。比如,p i m i 0 ...