2014-07-23 90 views
0

真的很簡單的問題,但我找不到答案:在內存分配方面,以下2個表達式在C++中是否等價?用於數組的C++內存分配

wchar_t wide_array[10]; 
wchar_t* ptr_wide_array = new wchar_t[10]; 

所以我想知道:無論我如何初始化它,我總是必須刪除數組嗎?或者我可以以某種方式受益於範圍設定,並在堆棧中生成數組,因爲它們超出了範圍,因此無需顯式調用delete即可死亡。當然,如果可能的話,是否值得使用範圍界定,還是總是使用刪除更安全?

+4

可能重複的[C + +靜態數組與動態數組?](http://stackoverflow.com/questions/2672085/c-static-array-vs-dynamic-array) – CoryKramer

+1

不,不,是的。閱讀介紹性書籍。這裏有一個很好的列表:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – juanchopanza

+1

但爲什麼不使用[std :: wstring](http://www.cplusplus .com/reference/string/wstring /)而不是數組? – crashmstr

回答

1

在C/C++中,數組很容易衰變[#]成指向其第一個元素的指針。所以*wide_arraywide_array[0]是同樣的事情。實際上,wide_array[i]實際上定義爲(或者,如果您喜歡,則爲語法糖)(wide_array + i)i[wide_array]意味着與wide_array[i]一樣的東西,這是一種混淆C/C++代碼的有趣方式(但永遠不會這麼做!)。

所以你的第二個例子也可以被引用爲ptr_wide_array[i]

這就像語法一樣。現在,至於發生了什麼:

你的兩個例子之間的區別是the first is allocated on the stack, the second on the heap。這意味着一旦超出範圍,第一個將自動解除分配,但第二個將不會被釋放,直到調用delete[] ptr_wide_array(或另一個從ptr_wide_array複製的指針)。這會造成內存泄漏的嚴重風險,特別是如果您開始使用異常。一般來說,不要在C/C++中使用原始的new。使用容器,如std::vectorsmart pointers

[#]請參閱this SO question瞭解數組和指針如何相關以及數組如何「衰減」指針。

+0

謝謝,很好的答案。你可能會解釋爲什麼在調試器的第一個例子旁邊顯示堆地址?查看我在帖子下的最新評論。 – Sesertin

+0

@Sesertin它只是一個地址。堆棧存在於處理器的內存映射中,就像堆一樣,所以堆棧中的東西都有地址,就像堆中的東西一樣。 – alastair

+1

不,數組不是指向第一個元素的指針,至少在C++中不是。這是一個導致許多問題的誤解。 – juanchopanza