Placement new 提供了一種為特定記憶體位置的物件分配記憶體的方法。雖然它與數組一起使用似乎很簡單,但實現可移植性可能會帶來挑戰。
問題
考慮以下範例:
char *pBuffer = new char[NUMELEMENTS*sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS];
這裡, pBuffer 包含由 new[] 指派的陣列的緩衝區。但是,new(pBuffer) A[NUMELMENTS] 可能不會傳回與 pBuffer 相同的位址,這可能會導致記憶體損壞。
解決問題
一種方法是使用placement new 手動單獨放置每個數組元素:
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); }
這可以確保每個元素都分配在數組中的正確位置buffer.
處理析構函數
刪除數組時,在刪除緩衝區之前必須手動調用每個元素的析構函數:
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i].~A(); } delete[] pBuffer;
這種方法保證了正確的物件清理和記憶體釋放。
結論
由於分配的位址和傳回的位址之間可能存在不對齊,因此陣列的新放置帶來了可移植性挑戰。透過手動放置每個陣列元素並處理析構函數,開發人員可以克服這些挑戰並在可移植程式碼中安全地利用新的放置。
以上是如何在可移植程式碼中安全地對數組使用 Placement New?的詳細內容。更多資訊請關注PHP中文網其他相關文章!