」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 C++ 中正確釋放透過 Placement New 分配的記憶體?

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

發佈於2024-11-07
瀏覽:933

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

placement new 和delete 難題

placement new 和delete 難題

在C 中,當使用placement new 運算子分配記憶體時,會出現關於取消分配的適當方法的困境那個記憶。讓我們探討兩個可能的解決方案:

const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer)   strlen(charString)   1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete (char*)buf;

const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) strlen(charString) 1); 緩衝區* buf = new(mem) 緩衝區(strlen(charString)); delete (char*)buf;

此解決方案嘗試刪除作為字元指標分配的記憶體。但是,這種方法是不正確的,因為它無法正確處理物件的析構函數或釋放原始記憶體。

const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer)   strlen(charString)   1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete buf;

const char* charString = “你好世界”; void *mem = ::operator new(sizeof(Buffer) strlen(charString) 1); 緩衝區* buf = new(mem) 緩衝區(strlen(charString)); delete buf;

此解決方案也嘗試刪除已指派的內存,但直接呼叫 Buffer* 指標上的刪除運算子。如果使用常規的 new 運算子分配內存,這將起作用。然而,由於使用了placement new,這種做法也是不正確的。

正確的解決方案:

buf->~Buffer();
::operator delete(mem);

buf->~Buffer(); ::operator delete(mem);

此解決方案明確呼叫Buffer 物件的析構函式(buf->~Buffer()),然後使用運算子刪除函式(::operator delete( mem) ).

How to Properly Deallocate Memory Allocated with Placement New in C  ? 
這裡的關鍵差異是,當使用placement new時,必須直接呼叫運算元delete函數來釋放原始記憶體。嘗試刪除從放置 new 運算子獲得的指標將無法正確呼叫析構函數或完全釋放記憶體。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3