2013-11-24 20 views
1
cin>>n; 

int * a; 
a=new int[n]; 

int b[n]; 

我認爲在這兩種情況下是動態創建陣列(指正)。所以,我們爲什麼不喜歡第二種情況在第一,因爲第二個是短而簡單。差2之間動態數組initilising

+1

您需要了解C++中的內存管理是如何工作的。即堆棧中由「new」和存儲器分配的堆中的存儲器。 –

+1

第二個不行。像Barmaley說的 –

+0

- 爲什麼甚至會問一個關於直接不能編譯的東西的問題? –

回答

4

第二個不能用標準C++工作。它的確在C中有效。一些編譯器提供了允許這樣做的擴展(C++),但它又是非標準的。 C++ 14將帶有std :: dynarray,這基本上是第二種「方式」所做的。

+0

C + + 14也將直接與VLA,但兩者都他們和'dynarray'都在TS中。 – chris

+0

...或者C++ 14會在沒有任何一個的情況下出現。我不確定當前的情況,但是有一些問題是用'dynarray'和相當於VLA的(它有一個我不記得的名字) –

+0

@DavidRodríguez-dribeas,據我所知,他們剛剛被轉移到一個TS,並且看起來很不錯。不過,我想事情可能會改變。 – chris

0

因爲這是誤導。

int b[n]用於靜態數組聲明。原則上在C++中是不允許的(在n不是常數的情況下),它只是編譯器擴展,它可以將int b[n]轉換爲int *b = new int[n]

在這種情況下,最好使用std ::載體,這也短,但不會誤導:

vector<int> b(n); 
+0

int b [n]'在函數內聲明時不是一個靜態數組,而且'int b [n]'與* * = new int [n]'不同*。前者是堆棧分配,後者是堆分配。 –

+0

@JimBuck,你在談論C++嗎?你能給我的鏈接,這說的相同嗎? – klm123

+0

如果編譯器將其轉換爲動態分配,這將是一個毫無意義的擴展。你可以在每個編譯器的文檔中閱讀它的工作原理。 – chris

0

的一個重要區別是,第一個在堆和分配內存,用適當的參考,可以在所有的程序中訪問。應該釋放一次不是引用(相應地調用delete)。

第二個將它分配到堆棧中,您可以在Why no VLAs in C++0x?處查看,這是對VLA的主要抱怨之一。該內存在退出當前塊後釋放。

另一方面,嚴格來說,它們都不是動態數組(動態添加/刪除多餘的元素)。如果你想使用動態數組,我會建議使用std::vector。雖然更適合於提供示例,但將使用std::array