首頁 > 後端開發 > C++ > 如何正確釋放 C 中透過 Placement New 分配的記憶體?

如何正確釋放 C 中透過 Placement New 分配的記憶體?

Mary-Kate Olsen
發布: 2024-10-30 18:24:03
原創
745 人瀏覽過

How to Properly Deallocate Memory Allocated with Placement New in C  ?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板