首頁 >後端開發 >C++ >使用 Placement New 時,「delete」實際上是否正確解除指派?

使用 Placement New 時,「delete」實際上是否正確解除指派?

Barbara Streisand
Barbara Streisand原創
2024-10-28 12:50:02827瀏覽

 When Using Placement New, Does `delete` Actually Deallocate Correctly?

放置新建和刪除

在 C 中,運算子重載允許使用自訂新建和刪除運算符。然而,這提出瞭如何正確釋放使用此類運算符分配的記憶體的問題。考慮以下程式碼片段:

<code class="cpp">const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1);
Buffer* buf = new(mem) Buffer(strlen(charString));

delete (char*)buf; // OR delete buf;</code>

將記憶體釋放任務委託給重載的刪除運算子(直接方法)似乎是合乎邏輯的。但是,這種方法是不正確的。

正確方法

在這種情況下釋放記憶體的正確方法是明確調用物件的析構函數,然後調用運算符delete 函數釋放分配的內存:

<code class="cpp">buf->~Buffer();
::operator delete(mem);</code>

說明

使用需要預先分配記憶體位址的放置new 運算子時,預設建構子是不會自動呼叫。因此,手動調用析構函數至關重要。或者,直接呼叫delete buf也是不正確的,因為它只呼叫全域運算子delete,而它不知道放置新分配。

何時使用Buf->~Buffer()

每當使用放置new 運算子時都需要析構函數呼叫(buf->~Buffer() ),即使隨後呼叫::operator delete 函數也是如此。

最佳實踐

為避免混淆,請務必使用一對符合的運算符,例如:

  • ::operator new和::operator delete
  • new()和delete()(放置新建/刪除)

以上是使用 Placement New 時,「delete」實際上是否正確解除指派?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn