2013-05-02 92 views
0

當我開始使用C++編程我瞭解到,通過使用動態存儲器分配到分配數組大小如下:在C++分配陣列

int main() 
{ 
    int nArrayLength; 

    cout << "Enter an array length: "; 
    cin >> nArrayLength; 

    int *nArray = new int[nArrayLength]; 

    // contents 

    delete[] nArray; 

    return 0; 
} 

現在我使用代碼::塊12.11與嘗試下面的代碼mingw32-g ++ // GNU GCC編譯器。

int main() 
{ 
    int nArrayLength; 

    cout << "Enter an array length: "; 
    cin >> nArrayLength; 

    int nArray[nArrayLength]; 

    return 0; 
} 

這也很好。

因此,爲什麼我應該在這種情況下使用動態內存分配時更簡單的方法也能正常工作?

回答

7

你既不應該使用。

第一個是有效的,但它是C風格的代碼。第二個是非標準代碼 - 由於某種擴展,它被該編譯器接受。

使用一個std::vector代替:

#include <vector> 
int main() 
{ 
    int nArrayLength; 

    cout << "Enter an array length: "; 
    cin >> nArrayLength; 

    std::vector<int> nArray(nArrayLength); 

    return 0; 
} 

vector具有相同的語義的陣列,它可以動態地(自動地)生長,在引擎蓋下完成所有的討厭的存儲器管理。

1

如果您使用GCC,請使用-pedantic選項編譯第二個代碼。它不會編譯。

這是因爲它不符合標準。可變長度數組(VLA)不在標準C++中。它是一個編譯器擴展。

0

有時您事先並不知道數組的大小,因此您需要爲其分配可能會動態增長或減少的存儲。您應該使用std::vector,因爲它透明地管理陣列存儲。

如果您不得不使用C風格的數組,像第一個代碼片段中使用它們,第二個不是標準的C++。

0

這取決於您是要使用堆棧還是使用堆。

如果希望在範圍消失時自動釋放堆分配,也可以使用auto_ptr。