placement new 和delete 難題
在C 中,當使用placement new 運算子分配記憶體時,會出現關於釋放分配的適當方法的困境那個記憶。讓我們探討兩個可能的解決方案:
解決方案 1:
<code class="c++">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString)); delete (char*)buf;</code>
此解決方案嘗試刪除作為字元指標分配的記憶體。但是,這種方法是不正確的,因為它無法正確處理物件的析構函數或釋放原始記憶體。
解決方案 2:
<code class="c++">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString)); delete buf;</code>
此解決方案也嘗試刪除已指派的內存,而是直接呼叫 Buffer* 指標上的刪除運算子。如果使用常規的 new 運算子分配內存,這將起作用。然而,由於使用了placement new,這種方法也是不正確的。
正確的解決方案:
釋放分配的記憶體的正確方法是:
<code class="c++">buf->~Buffer(); ::operator delete(mem);</code>
此解決方案明確呼叫Buffer 物件的析構函式(buf->~Buffer()),然後使用運算子刪除函式(::operator delete(mem)) 釋放原始記憶體。
這裡的關鍵差異是,使用placement new時,必須直接呼叫operator delete函數來釋放原始記憶體。嘗試刪除從放置 new 運算子獲得的指標將無法正確呼叫析構函數或完全釋放記憶體。
以上是如何正確釋放 C 中透過 Placement New 分配的記憶體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!