首頁 >後端開發 >C++ >如何在 C 中正確釋放透過「placement new」分配的記憶體?

如何在 C 中正確釋放透過「placement new」分配的記憶體?

DDD
DDD原創
2024-10-30 12:50:02643瀏覽

 How to Properly Deallocate Memory Allocated with

手動分配記憶體的正確清理:「放置新」和「刪除」

在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中文網其他相關文章!

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