放置新建和刪除
在 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 函數也是如此。
最佳實踐
為避免混淆,請務必使用一對符合的運算符,例如:
以上是使用 Placement New 時,「delete」實際上是否正確解除指派?的詳細內容。更多資訊請關注PHP中文網其他相關文章!