【C++】重载new操作符
为什么要重载new操作符定制内存管理默认的new操作符按照标准方式分配内存在某些情况下比如需要特定的内存对齐、使用特殊的内存池或者对内存分配进行统计等就需要重载new操作符来自定义内存分配行为。提高性能对于频繁分配和释放内存的场景使用定制的内存分配策略可以减少内存碎片提高内存分配和释放的效率。重载全局new操作符语法cppvoid* operator new(std::size_t size) { // 自定义内存分配逻辑 void* ptr std::malloc(size); if (!ptr) { throw std::bad_alloc(); } return ptr; }说明全局new操作符的重载函数必须返回一个指向分配内存的指针如果分配失败应抛出std::bad_alloc异常。std::size_t是new操作符传入的参数表示需要分配的内存大小以字节为单位。在上述示例中我们使用std::malloc进行内存分配这是一种简单的替代默认new操作符行为的方式。实际应用中可以实现更复杂的内存管理策略如内存池技术。重载类专属的new操作符语法cppclass MyClass { public: void* operator new(std::size_t size) { // 类专属的内存分配逻辑 void* ptr std::malloc(size); if (!ptr) { throw std::bad_alloc(); } return ptr; } };说明类专属的new操作符仅对该类的对象分配内存时起作用。当使用new MyClass()创建对象时会调用这个重载的new操作符。同样如果分配失败应抛出std::bad_alloc异常。重载new操作符并进行内存对齐语法cppvoid* operator new(std::size_t size, std::align_val_t alignment) { void* ptr nullptr; int err std::posix_memalign(ptr, static_castsize_t(alignment), size); if (err) { throw std::bad_alloc(); } return ptr; }说明这种形式的new操作符重载用于实现特定的内存对齐。std::align_val_t表示对齐值常见的对齐值如alignas(16)表示按 16 字节对齐。std::posix_memalign是 POSIX 标准库中的函数用于分配对齐的内存。如果分配成功ptr将指向对齐后的内存地址如果失败err将为非零值此时应抛出std::bad_alloc异常。重载delete操作符全局delete操作符重载cppvoid operator delete(void* ptr) noexcept { std::free(ptr); }类专属delete操作符重载cppclass MyClass { public: void* operator new(std::size_t size) { void* ptr std::malloc(size); if (!ptr) { throw std::bad_alloc(); } return ptr; } void operator delete(void* ptr) noexcept { std::free(ptr); } };说明delete操作符的重载必须与对应的new操作符重载相匹配。当使用delete释放通过重载new操作符分配的内存时会调用对应的重载delete操作符。全局delete操作符用于释放全局new操作符分配的内存类专属delete操作符用于释放该类对象通过类专属new操作符分配的内存。noexcept说明该函数不会抛出异常这是delete操作符重载的要求。重载new操作符时要谨慎处理内存分配和异常情况确保内存管理的正确性和安全性。同时合理使用delete操作符的重载来匹配new操作符避免内存泄漏。