2011-07-28 46 views
0
int d; 
cin >> d; 
int asdf[d]; 

這是否被認爲是動態內存分配?根據http://www.cplusplus.com/doc/tutorial/dynamic/,似乎我甚至不應該能夠編譯這個,因爲不使用新運算符的數組只能以常量大小聲明,或許我讀錯了。 (我使用的代碼塊與GNU編譯器CCC)C++中的動態內存分配需要新的操作符new?

那是什麼和

int d; 
int *asdf; 
cin >> d; 
asdf = new int[d]; 

是使用新的生活,直到它被刪除的陣列創建唯一的區別,而第一陣列成爲釋放之間的區別一旦你離開範圍?

回答

9

int x[n];可變長度陣列(VLA),其具有自動存儲持續時間(即「在堆疊上」)。它在C89或C++ 98/03中無效,但是它在C99中引入,並且通常可作爲擴展來使用,例如,在GCC。

該功能還可以在某些平臺上使用非標準alloca()函數來模擬,該函數在VLA變得常見之前使用。

+0

謝謝你回答我的問題並通知我C99 – newprogrammer

1

使用第一種方法分配的內存來自分配給應用程序的堆棧。當你使用new時,內存是從堆中分配的,堆可以提供足夠的內存方式,而不是從堆中獲取內存。但要使用新的變量必須是與數組相同類型的指針。指針變量保存第一個存儲單元的地址。 int * a = new int [x];將保存x個存儲單元,並且如果在程序仍在運行時專門刪除指針,它將被釋放。