int a;
cin >> a;
int n[a];
當我使用Visual Studio程序沒有編譯和報告錯誤。但是當我用終端編譯程序時沒有遇到任何問題。爲什麼這樣?這是否被認爲是動態內存分配?這是否被認爲是動態內存分配?
int a;
cin >> a;
int n[a];
當我使用Visual Studio程序沒有編譯和報告錯誤。但是當我用終端編譯程序時沒有遇到任何問題。爲什麼這樣?這是否被認爲是動態內存分配?這是否被認爲是動態內存分配?
不,這在C++11或C++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發佈)。
此外,任何分配一個固定大小但不包含'new'的數組在使用'new'分配之後都會消失,需要通過析構函數釋放分配的空間才能高效。我說「固定」的原因是,即使使用'new',大小也必須來自某個地方,所以從技術上來說這是一個固定的大小,即使它不是針對每一個運行時 –
它是g ++的擴展...這是一個來自C99的語法。 – xinaiz