手動分配記憶體的正確清理:「放置新」和「刪除」
在C 中,可以手動管理記憶體分配和釋放使用“放置新”和“刪除”運算符。這使得記憶體管理具有更大的靈活性,但也引入了潛在的陷阱。讓我們深入研究釋放使用“placement new”分配的記憶體的正確方法。
考慮下面的程式碼片段:
<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;</code>
<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 buf;</code>
在這兩個範例中,記憶體都是使用低分配的-level 運算子 new 函數並轉換為 void*。然後,使用「placement new」語法在分配的記憶體中建構一個 Buffer 物件。
但是,關鍵的區別在於釋放。第一個片段錯誤地嘗試將 buf 指標作為 char* 刪除,假設記憶體區塊是使用運算子 new 分配的。但是,這會導致記憶體損壞。
第二個片段示範了正確的方法:
<code class="cpp">buf->~Buffer(); ::operator delete(mem);</code>
使用「placement new」時,也必須手動呼叫析構函數。然後,您應該呼叫運算子刪除函數,提供與運算子 new 所使用的相同的指標。這確保了物件被正確銷毀,並且分配的記憶體被釋放回系統。
記住,只刪除您指派的內容。直接呼叫operator new需要手動呼叫operator delete和析構函數來完成記憶體清理。
以上是如何在 C 中正確釋放透過「placement new」分配的記憶體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!