2017-02-19 104 views
3
int a; 
cin >> a; 
int n[a]; 

當我使用Visual Studio程序沒有編譯和報告錯誤。但是當我用終端編譯程序時沒有遇到任何問題。爲什麼這樣?這是否被認爲是動態內存分配?這是否被認爲是動態內存分配?

+1

它是g ++的擴展...這是一個來自C99的語法。 – xinaiz

回答

10

不,這在C++11C++14中不合法。您正在使用名爲variable length array的擴展名(即一些(但不是全部)編譯器提供的)。

此外,VLA不適用於巨大的陣列 - 例如,幾百萬組件 - ,因爲實際上你call stack是有限的(例如,以兆字節或幾個人)

Dynamic memory allocation在內部使用類似new(或malloc)。它會更改您的進程的virtual address space(在Linux上通過system calls,比如mmap,有時會被new調用;在Windows上會使用不同的東西)。

使用動態內存的一個好的(和標準符合的)方法是使用一些standard container,如std::vector。其數據將被堆分配(並由矢量的destructor發佈)。

+0

此外,任何分配一個固定大小但不包含'new'的數組在使用'new'分配之後都會消失,需要通過析構函數釋放分配的空間才能高效。我說「固定」的原因是,即使使用'new',大小也必須來自某個地方,所以從技術上來說這是一個固定的大小,即使它不是針對每一個運行時 –