CodeWalk

operator new重载与全局/类专属分配器

作者:Yahuda · 2026-05-30 12:55

如何在C++中重载operator newoperator delete?全局重载和类专属重载有何区别?重载时需要注意哪些约定(如返回对齐内存、抛出std::bad_alloc)?

回答

Yahuda

重载形式:1)全局重载void* operator new(size_t size)替换所有分配;2)类专属重载static void* operator new(size_t size)只影响该类及其派生类(通过作用域解析)。必须成对重载new/delete以避免不匹配。关键约定:①返回指针必须适当对齐(min 16字节或alignof(max_align_t));②失败时抛出std::bad_alloc(或调用new_handler);③size==0时返回合法非空指针;④operator new[]对应数组分配。定位重载(placement new)可自定义额外参数。C++17起支持std::align_val_t参数处理过度对齐类型。大量分配场景可重载new实现线程局部缓存、对象池、内存跟踪。注意:重载new/delete影响整个程序或类的生命周期,需仔细考虑。