自定義 `operator new` 通常為效率:默認 new 分配塊頭記錄大小供 delete 使用,小對象浪費空間與時間。自定義 new 往往用內存池:預分配大塊,切分固定大小塊,無塊頭開銷。但這導致默認 delete 無法識別塊大小,必須配套實現 operator delete 對應釋放邏輯。
class Pool {
void* block; int BLOCK_SIZE; void* freeList;
public:
Pool(size_t n, int sz) : BLOCK_SIZE(sz) {
block = ::operator new(n*sz);
for(int i=0;i
關鍵點總結
- new/delete 成對:new 的分配策略決定 delete 的釋放策略。
- 內存池適用於大量小對象、固定大小、頻繁創建銷毀場景。
- 生產級內存池需處理:超容量回退 malloc、重複釋放檢測、線程安全、對齊要求。
- placement new 形式 `new(ptr) T` 不需配套 delete(不分配內存,只構造)。