首頁 > 後端開發 > C++ > 數組上的放置 New 能否保證 C 中的可移植性?

數組上的放置 New 能否保證 C 中的可移植性?

Patricia Arquette
發布: 2024-11-12 16:48:02
原創
469 人瀏覽過

Does Placement New on Arrays Guarantee Portability in C  ?

陣列的 Placement New 能否確保可移植性?

雖然placement new 提供了一種在 C 中初始化數組的方法,但它在數組中的使用引入了潛在的潛力可移植性問題。具體來說,從 new[] 獲得的指標可能會偏離提供的位址,從而阻礙陣列的緩衝區分配。

標準的 5.3.4,註 12,承認了這種差異,使得分配緩衝區的挑戰數組的適當大小。一個範例突出顯示了該問題:

int main() {
  const int NUMELEMENTS = 20;
  char *pBuffer = new char[NUMELEMENTS * sizeof(A)];
  A *pA = new(pBuffer) A[NUMELEMENTS];

  // With Visual Studio, pA will be four bytes higher than pBuffer
  printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);
}
登入後複製

在此範例中,編譯器似乎在緩衝區的前四個位元組中儲存了數組元素的計數。因此,會發生記憶體損壞,因為緩衝區僅分配了 sizeof(A) * NUMELMENTS 位元組的空間。

避免可移植性問題:

為了減輕這些可移植性問題,請考慮以下方法:

  • 手動放置新:不要在數組上使用放置新,而是使用它單獨初始化每個數組元素。例如:
int main() {
  const int NUMELEMENTS = 20;
  char *pBuffer = new char[NUMELEMENTS * sizeof(A)];
  A *pA = (A*)pBuffer;

  for (int i = 0; i < NUMELEMENTS; ++i) {
    pA[i] = new (pA + i) A();
  }

  printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);
}
登入後複製
  • 手動銷毀:在刪除緩衝區之前手動銷毀每個陣列元素,以防止記憶體洩漏。

需要注意的是,放置 new[] 的額外開銷可能會因實作和類別定義而異。儘管如此,這種手動方法確保了不同編譯器之間的可移植性,並且無需動態確定開銷。

以上是數組上的放置 New 能否保證 C 中的可移植性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板