簡體   English   中英

數組的C ++內存分配

[英]C++ memory allocation for arrays

確實很簡單的問題,但是我找不到答案:就內存分配而言,以下2個表達式在C ++中是否等效?

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

所以我想知道:無論我如何初始化,都必須刪除數組嗎? 或者,我可以從某種程度上受益於范圍界定並在堆棧上生成數組,這些數組在超出范圍時會死而無需顯式調用delete,而不會顯式調用。 當然,如果可能的話,值得使用作用域定義嗎?還是始終使用delete更為安全?

在C / C ++中,數組很容易將[#]衰減為指向其第一個元素的指針。 所以*wide_arraywide_array[0]是同一件事。 實際上, wide_array[i]實際上定義為(wide_array + i) (或者,如果您願意,則是語法糖(wide_array + i) 如此之多以至於i[wide_array]wide_array[i] i[wide_array]含義相同,這是使C / C ++代碼模糊化的一種有趣的方式(但從來沒有這樣做!)。

因此,您的第二個示例也可以引用為ptr_wide_array[i]

就語法而言。 現在,關於幕后情況:

您的兩個示例之間的區別在於, 第一個示例分配在堆棧上,第二個分配在堆上 這意味着第一個指針將在超出范圍后自動釋放,但是第二個指針將在調用delete[] ptr_wide_array (或從ptr_wide_array復制的另一個指針)之前被釋放。 這會帶來嚴重的內存泄漏風險,尤其是在您開始使用異常的情況下。 通常,不要在C / C ++中使用原始的new 使用容器,例如std::vector智能指針

[#]請參見此SO問題 ,以獲取有關數組和指針如何關聯以及數組如何“衰減”到指針的解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM