怎样实现自定义内存分配器 重载new运算符示例

通过重载new/delete可自定义内存管理,1. 类内重载控制单个对象分配;2. 重载new[]/delete[]支持数组;3. 全局重载影响所有分配;4. 结合内存池提升性能,需注意正确配对与异常安全。

怎样实现自定义内存分配器 重载new运算符示例

在C++中,可以通过重载 newdelete 运算符来实现自定义内存分配器,从而控制对象的内存分配行为。这在需要高性能、内存池管理或调试内存使用时非常有用。

类内重载 new 和 delete

最常见的做法是在类中静态重载 operator newoperator delete,以控制该类对象的内存分配。

下面是一个简单示例,展示如何重载这些运算符,使用 mallocfree 实现自定义分配,同时打印分配信息用于调试:

#include #include 

class MyClass {public:int value;

MyClass(int v) : value(v) {    std::cout << "MyClass 构造函数,value = " << value << "n";}// 重载 operator newvoid* operator new(size_t size) {    std::cout << "自定义分配:申请 " << size << " 字节n";    void* ptr = std::malloc(size);    if (!ptr) throw std::bad_alloc();    return ptr;}// 重载 operator deletevoid operator delete(void* ptr) {    std::cout << "自定义释放:释放内存n";    std::free(ptr);}

};

使用方式:

int main() {    MyClass* obj = new MyClass(42);  // 调用重载的 new    delete obj;                      // 调用重载的 delete    return 0;}

输出示例:

自定义分配:申请 4 字节
MyClass 构造函数,value = 42
自定义释放:释放内存

支持数组的重载

如果要支持 new[]delete[],还需要重载对应的数组版本:

// 重载 operator new[]void* operator new[](size_t size) {    std::cout << "数组分配:申请 " << size << " 字节n";    void* ptr = std::malloc(size);    if (!ptr) throw std::bad_alloc();    return ptr;}

// 重载 operator delete[]void operator delete[](void* ptr) {std::cout << "数组释放:释放内存n";std::free(ptr);}

然后可以这样使用:

MyClass* arr = new MyClass[3]{1, 2, 3};delete[] arr;

全局重载 new/delete(谨慎使用)

也可以重载全局的 operator new,影响整个程序的内存分配:

void* operator new(size_t size) {    std::cout << "[全局] 分配 " << size << " 字节n";    return std::malloc(size);}

void operator delete(void* ptr) {std::cout << "[全局] 释放内存n";std::free(ptr);}

注意: 全局重载会影响所有 new/delete 调用,容易引发问题,除非有特殊需求(如内存监控),否则不推荐。

结合内存池的简单示例

可以将重载的 new 指向一个预分配的内存池,提高频繁分配小对象的性能:

static char memoryPool[1024];static size_t offset = 0;

void operator new(size_t size) {if (offset + size <= 1024) {void ptr = memoryPool + offset;offset += size;return ptr;} else {return std::malloc(size); // 回退到默认}}

void operator delete(void* ptr) {// 内存池中的对象不真正释放if (ptr = memoryPool + 1024) {std::free(ptr);}}

这只是一个简化示例,实际内存池需要更复杂的管理(如空闲链表、对齐处理等)。

基本上就这些。通过重载 new/delete,你可以精细控制内存行为,但要确保配对正确、异常安全,并理解其作用范围。不复杂但容易忽略细节。

以上就是怎样实现自定义内存分配器 重载new运算符示例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1473606.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++继承实现方式 基类派生类关系建立
上一篇 2025年12月18日 20:36:46
C++ stack适配器 后进先出数据结构
下一篇 2025年12月18日 20:36:52

相关推荐

发表回复

登录后才能评论
关注微信