天天看點

C++ 動态記憶體配置設定

通常,我們在聲明一個數組時,數組的元素個數是确定的,即是一個常數。在編譯的時候,編譯器會根據數組的大小配置設定好記憶體。

如果我們需要在運作時決定數組的大小,比如接受使用者的輸入。此時,如果你試圖用變量來代替常量,編譯器則不允許通過。

在C++中,提供了兩個專有的操作符,new delete

new基本格式是:

new data_type;
new data_type[array_element_size];
           

new後面跟一個資料類型,比如int,double等。如果隻請求一組元素,則需添加一個中括号,中括号裡存儲數組的大小,可以是常量,也可以是變量。

new操作符傳回的是一個相應類型的指針。如果請求的是一個元素,則該指針指向該元素的第一個位元組。如果是數組,則指向該數組的第一個元素的第一個位元組。

如果數組的大小太大,比如使用者申請10億個數組,則配置設定失敗,會抛出異常。為了簡單起見,我們可以在 new後加一個參數nothrow,如果記憶體配置設定失敗,則傳回一個null的指針。

對于動态配置設定的數組通路,可以有兩種方法,如果我們想通路第1個元素,pointer[0]     or      *(pointer+0)

new的一個簡單例子:

int main()
{
	int i;
	int * pointer;
	cout<<"請輸入一個數字"<<endl;
	cin>>i;
	pointer = new(nothrow) int[i];
	if(pointer == 0)
	{
		cout<<"動态記憶體配置設定失敗"<<endl;
	}
	else
	{
		cout<<"記憶體配置設定成功"<<endl;
	}
}
           

該例子中聲明了一個變量i,用來存儲使用者輸入的數字。然後通過new操作符動态申請記憶體,如果申請成功,将該數組的第一個元素的指針傳回給pointer。否則傳回null。

動态配置設定的記憶體存儲在記憶體堆中(heap),因為我們知道記憶體是有限的,是以處理完之後應該釋放空間,這裡需要用到另一個操作符 delete。

 delete基本格式:

delete pointer;
delete[] pointer;
           

第一種格式是釋放一個元素空間,第二種格式是釋放一個數組空間。

是以上面的例子存在漏洞,修改之後:

int main()
{
	int i;
	int * pointer;
	cout<<"請輸入一個數字"<<endl;
	cin>>i;
	pointer = new(nothrow) int[i];
	if(pointer == 0)
	{
		cout<<"動态記憶體配置設定失敗"<<endl;
	}
	else
	{
		cout<<"記憶體配置設定成功"<<endl;
	}

	delete[] pointer;
}
           

注意new 和delete操作符是C++專有的,C語言不含有該操作符,但是有其它操作動态記憶體配置設定的函數,比如malloc,realloc,calloc和free。C++如果包含<cstdlib>也可以使用該函數。

Over...