C/C++ 內存管理經歷三次變革:malloc/free → new/delete(強類型) → allocator(STL 引入)。但 allocator 除 STL 內部外鮮被使用,變革未徹底。
new/delete(誤導設計),而應關心成員/組件如何創建。現有 allocator 多基於 memory pool,只顧分配速度,未解決「程序員從繁瑣內存管理中解脫」。**引入具備垃圾回收能力的 Allocator**,實現半自動 GC:
// 簡單 allocator 封裝 malloc/free
class SimpleAlloc {
public:
void* Alloc(size_t cb, FnDestructor fnDestroy = NULL) { return malloc(cb); }
void Free(void* data, size_t cb) { free(data); }
};
// 萃取析構函數
template <class Type> struct DestructorTraits {
static void Destruct(void* pThis) { ((Type*)pThis)->~Type(); }
};
// 輔助 New 操作(placement new + allocator)
template <class Type, class AllocType>
inline Type* New(AllocType& alloc) {
void* obj = alloc.Alloc(sizeof(Type), DestructorTraits<Type>::Destruct);
return new(obj) Type;
}
支援 New(alloc)、New(arg, alloc)、NewArray(count, alloc) 等變體。
COM AddRef/Release 核心是「確保不提前銷毀、訪問安全」,代價是程序員沉重負擔、難查漏、大片洩漏。GC 核心是「確保最終銷毀、無洩漏」。**理想融合:Allocator 提供 GC 能力,用戶可控時機、可強制釋放**。
兩個原創 allocator 將後續發布,拋磚引玉,喚醒社區重視 allocator,**徹底淘汰 new/delete,讓 C++ 程序員擺脫內存管理苦難**。