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) ).這裡的關鍵差異是,當使用placement new時,必須直接呼叫運算元delete函數來釋放原始記憶體。嘗試刪除從放置 new 運算子獲得的指標將無法正確呼叫析構函數或完全釋放記憶體。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3