一. 用new和delete創建和釋放單個對象
動態創建對象時,只需要指定其數據類型, 而不必為該對象命名. new 表達式返回指向新創建對象的指針, 通過指針來訪問此對象.
int *pi = new int;這個new表達式在自由存儲區中分配創建了一個整型對象, 並返回此對象的地址, 並用該地址初始化指針pi.
1.動態創建對象的初始化
動態創建的對象可用初始化變量的方式實現初始化.
int *pi = new int (1024) ;
string *ps = new string(10, '9');
2.動態創建對象的默認初始化
如果不提供顯示初始化, 對於類類型的對象, 用該類的默認構造函數初始化;而內置類型的對象則無初始化.
string *ps = new string() ; string *ps= new string ;對於類類型, 例如上面的string類型, 兩個語句是一樣的, 都是初始化為空字符串.
而對於內置類型, 如
int *pi = new int; int *pi = new int();不初始化和提供顯示初始化的結果有顯著的差別.
第一個語句pi指向一個未初始化的int類型, 而第二個語句pi指向一個初始化為0的int類型.
3.耗盡內存
如果程序用完了所有可用的內存, new表達式就有可能失敗. 如果new表達式無法獲取想要的內存空間, 系統將拋出名為bad_alloc的異常.
4.撤銷動態創建的對象
動態創建的對象用完後, 程序員必須顯式地將該對象占用的內存返回給自由存儲區. c++提供delete表達式釋放指針所指向的地址空間.如果指針指向的不是用new分配的內存地址, 則在該指針上使用delete是不合法的.
delete pi;
5.在delete後,重設指針的值
執行語句 delete pi;後, pi編成了不確定的指針, 它仍然存放了它之前所指向對象的地址, 然而pi所指的內存已經被釋放, 因此p不再有效.
刪除指針後, 該指針變成懸掛指針. 懸掛指針指向曾經存放對象的內存, 但該對象已經不存在了. 懸掛指針往往導致程序錯誤, 而且很難檢測出來.
一旦刪除了指針所指向的對象, 立即將指針置為0, 這樣就非常清楚地表明指針不再指向任何對象.
二. 創建動態數組
1.動態數組的定義
數組變量通過指定類型, 數組名和維數來定義. 而動態分配數組時, 只需指定類型和數組長度, 不必為數組對象命名, new表達式返回指向新分配數組的第一個元素的指針:
int *pia = new int[10];
此new表達式分配了一個含有10個int型元素的數組, 並返回指向該數組第一個元素的指針, 此返回值初始化了指針pia.
new表達式需要指定指針類型以及在括號中給出的數組維數, 該維數可以是任意的復雜表達式.
2.初始化動態分配的數組
類類型: 使用該類的默認構造函數初始化.
內置類型: 無初始化
string *psa = new string[10]; //一個含有10個空字符串的數組
int *pia= new int[10]; 含有10個未初始化int的數組
也可以使用跟在數組長度後面的一對空括號, 對數組元素做值初始化.
int *pia2 = new int[10] ();
上述表達式把數組元素都設置為0.
對於動態分配的數組, 其元素只能初始化為元素類型的默認值, 而不能像數組變量一樣 , 用初始化列表為數組元素提供各不相同的初值.
4.允許動態分配空數組
char *cp = new char[0];
用new動態創建長度為0的數組時, new返回有效的非零指針. 該指針與new返回的其他指針不同, 不能進行解引用操作, 因為畢竟它沒有指向任何元素.
5.動態空間的釋放
delete [] pia;
該語句回收了pia所指向的數組, 把相應的內存返還給自由存儲區. 記得要有[] , 否則會導致少釋放了內存空間, 導致內存洩漏.