1. 程式人生 > >C++ new動態分配記憶體和delete釋放記憶體

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是安全的.