C++ new動態分配記憶體和delete釋放記憶體
C++中使用簡便而強大的new和delete運算子來進行動態記憶體的分配.
值得注意的是,new和delete和c語言中的malloc和free不同,new和delete是運算子,因此執行效率更高.
如何使用new , delete 呢?
首先我們來看一段程式碼:
int *p = new int;
我們可以看到有那些元素.
首先是int, 它的含義是宣告指標型別;
其次是*p, p是指標變數(注意,指標也是一種變數,可以理解為它的型別為int *)名.
= 是賦值符號,為什麼是賦值符號呢?因為後面一段程式碼返回的是一個地址,地址賦給了p
new int 是什麼意思呢?new是一種運算子,它返回的是一種資料型別的記憶體地址.
一般格式如下:
new typename (value)
所以,之前那一段程式碼也可以拆分為:
int *p;
p = new int;
如果想給 *p 賦值,應該這樣
int *p = new int (12);
這是最基本的宣告動態變數方法.
如何用new來宣告陣列? 首先介紹一維陣列:
int *p = new int[4];
和上面不同的是,這段程式碼後面是 [4],這意味著什麼呢?
這意味著new了一個數組元素數為4的一維陣列.
OK,任務完成. 可是,細心的小夥伴可能會發現,這樣的話, 上面提到給變數賦值的(value)怎麼辦呢?放在哪呢?
事實上,C++不支援在動態分配陣列記憶體的時候給陣列賦初值.所以,想要賦初值,只能自己寫個迴圈語句賦過去咯.
一維陣列是這樣,那麼二維乃至多維呢?
二維可以這樣:
int (*p)[3] = new int [4][3];
這樣就動態聲明瞭一個行是4, 列是3的陣列.
值得注意的是,在此程式碼 [3] 這個位置,"3"的值可以是常量(1,2...),或者const常量,不能是變數.(表示被坑過) "4"處,可以是變數
還有另一種宣告方式:
int **p = new int *[n];
for( int i=0;i<n;++i ) {
p[i] = new int [m];
}
這樣就生成了行為n, 列為m的二維陣列了.
這樣的方法較前一種複雜些,但m, n都可以是變數.
可以這麼理解:先生成了一個以為陣列,然後再在每個元素的位置生成一個一維陣列,這樣,一個二維陣列就這樣建立起來了.
同樣,參照這種方法,可以建立多維陣列.
new講完了,那麼delete呢?
delete的作用不做贅述, 我們只講各種形式如何delete.
首先
int *p = new int;
int *p = new int(1);
這兩種delete是一樣的
delete p;
然後
int *p = new int [4];
這是一維陣列,所以delete的方式有些不同
delete []p;
只有[]的不同:[]告訴程式,應釋放整個陣列,而不僅是指標指向的元素.
二維陣列呢?
for( int i=0;i<n;++i )
{
delete [] p[i];
}
delete [] p;
注意:
不要用delete來釋放同一個記憶體兩次,程式執行會出錯.
不要用delete來釋放不是new分配的記憶體
對空指標應用delete是安全的.