定義變數時,必須指定其資料型別和名字,而建立動態物件時只需要指定其資料型別,而不必為該物件命名
int i;
int *pi=new int;
這個new表示式在自由儲存區中分配建立了乙個整形物件,並返回次兌現光額位址,並用改位址初始化pi;
1.動態建立的物件可以用初始化變數的方式實現初始化:
int i(2024);
int *pi=new int(2024);
string s(10,'9');
string s=new string(10,『9』);
2.動態陣列的預設初始化
如果不顯示的初始化,動態建立的物件與在函式內定義的變數初始化的方式相同。類型別就用自己預設的建構函式初始化,而內建型別如果不顯示的初始化那就沒有初始化,所以,內建型別一般顯示的初始化。
如int*pi=new int();//初始化為0
3.撤銷動態建立物件
c++提供了delete表示式釋放指標所指向的記憶體空間。
delete pi;
該指令釋放了指標pi指向的int行物件所占用的記憶體空間。
如果指標指向的不是new分配的記憶體位址,則該指標傻姑娘使用delete是不合法的。
4.在delete之後重設指標的值
執行語句;
delete pi;
後,pi變成不確定的指標。在很多機器上,儘管pi值沒有明確的定義,但仍然存放了他之前所指向物件的位址,然而pi所指向的記憶體已經釋放,因此pi不在有效。
刪除指標後,該指標變為懸垂指標。懸垂指標指向曾經存放物件的記憶體,但是該物件已經不復存在了。懸垂指標往往導致編譯錯誤,而且很難檢測出來。
一旦刪除了指標所指向的物件,立即將指標置為0,這樣就非常清楚的表明指標不在指向任何物件。
警告:常見的三種程式錯誤都與動態記憶體分配有關;
(1)刪除delete指向動態分配記憶體的指標失敗,因而無法將該塊記憶體返還給自由儲存區。刪除動態記憶體失敗稱為記憶體洩露。
(2)讀寫已經刪除了的物件。將刪除指標所指向的物件之後將指標設定為0則比較容易檢測出此類問題。
(3)對同一記憶體塊使用兩次delete表示式。當兩個指標指向同乙個動態建立的物件刪除時就會發生錯誤。如果在其中乙個指標上做delete運算,將該物件的記憶體空間返還給自由儲存區,然後接著delete第二個指標,此時自由儲存區就有可能被破壞。
new和delete表示式
1.系統為每個程式都提供了乙個在程式執行時可用的記憶體池.這個可用記憶體池被稱為程式的空閒儲存區 free store 或堆 heap 執行時刻的記憶體分配被稱為動態記憶體分配 dynamic memory allocation new表示式返回指向新分配的物件的指標.int pi new int ...
c 寒假學習 new與delete表示式
一 new表示式工作步驟 使用new表示式時發生的三個步驟 呼叫名為operator new的標準庫函式,分配足夠大的原始的未型別化的記憶體,以儲存指定型別的乙個物件 執行該型別的乙個建構函式初始化物件 返回指向新分配並構造的建構函式物件的指標 二 nedelete表示式工作步驟 使用delete表...
C 定位new的表示式
我在學習記憶體池的時候,是先學習的物件池,學的時候很迷惑的一點就是 物件池,說的是針對於某乙個型別的物件,為這個型別的物件開闢出一段空間,我們要的是空間,返回的就是空間啊,為什麼要對這個空間進行初始化呢?為什麼要使用new的定位表示式對已有的空間進行初始化呢?我頓感了許久,和同學們也有討論,下面是我...