通常,我們在聲明一個數組時,數組的元素個數是确定的,即是一個常數。在編譯的時候,編譯器會根據數組的大小配置設定好記憶體。
如果我們需要在運作時決定數組的大小,比如接受使用者的輸入。此時,如果你試圖用變量來代替常量,編譯器則不允許通過。
在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...