真的很簡單的問題,但我找不到答案:在內存分配方面,以下2個表達式在C++中是否等價?用於數組的C++內存分配
wchar_t wide_array[10];
wchar_t* ptr_wide_array = new wchar_t[10];
所以我想知道:無論我如何初始化它,我總是必須刪除數組嗎?或者我可以以某種方式受益於範圍設定,並在堆棧中生成數組,因爲它們超出了範圍,因此無需顯式調用delete即可死亡。當然,如果可能的話,是否值得使用範圍界定,還是總是使用刪除更安全?
真的很簡單的問題,但我找不到答案:在內存分配方面,以下2個表達式在C++中是否等價?用於數組的C++內存分配
wchar_t wide_array[10];
wchar_t* ptr_wide_array = new wchar_t[10];
所以我想知道:無論我如何初始化它,我總是必須刪除數組嗎?或者我可以以某種方式受益於範圍設定,並在堆棧中生成數組,因爲它們超出了範圍,因此無需顯式調用delete即可死亡。當然,如果可能的話,是否值得使用範圍界定,還是總是使用刪除更安全?
在C/C++中,數組很容易衰變[#]成指向其第一個元素的指針。所以*wide_array
和wide_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::vector
和smart pointers。
[#]請參閱this SO question瞭解數組和指針如何相關以及數組如何「衰減」指針。
謝謝,很好的答案。你可能會解釋爲什麼在調試器的第一個例子旁邊顯示堆地址?查看我在帖子下的最新評論。 – Sesertin
@Sesertin它只是一個地址。堆棧存在於處理器的內存映射中,就像堆一樣,所以堆棧中的東西都有地址,就像堆中的東西一樣。 – alastair
不,數組不是指向第一個元素的指針,至少在C++中不是。這是一個導致許多問題的誤解。 – juanchopanza
可能重複的[C + +靜態數組與動態數組?](http://stackoverflow.com/questions/2672085/c-static-array-vs-dynamic-array) – CoryKramer
不,不,是的。閱讀介紹性書籍。這裏有一個很好的列表:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – juanchopanza
但爲什麼不使用[std :: wstring](http://www.cplusplus .com/reference/string/wstring /)而不是數組? – crashmstr