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

在C++中,可以通过重载 new 和 delete 运算符来实现自定义内存分配器,从而控制对象的内存分配行为。这在需要高性能、内存池管理或调试内存使用时非常有用。
最常见的做法是在类中静态重载 operator new 和 operator delete,以控制该类对象的内存分配。
下面是一个简单示例,展示如何重载这些运算符,使用 malloc 和 free 实现自定义分配,同时打印分配信息用于调试:
#include <iostream>
#include <cstdlib>
<p>class MyClass {
public:
int value;</p><pre class='brush:php;toolbar:false;'>MyClass(int v) : value(v) {
std::cout << "MyClass 构造函数,value = " << value << "\n";
}
// 重载 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);
}};
使用方式:
int main() {
MyClass* obj = new MyClass(42); // 调用重载的 new
delete obj; // 调用重载的 delete
return 0;
}
输出示例:
自定义分配:申请 4 字节如果要支持 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;
}
<p>// 重载 operator delete[]
void operator delete[](void* ptr) {
std::cout << "数组释放:释放内存\n";
std::free(ptr);
}</p>然后可以这样使用:
MyClass* arr = new MyClass[3]{1, 2, 3};
delete[] arr;
也可以重载全局的 operator new,影响整个程序的内存分配:
void* operator new(size_t size) {
std::cout << "[全局] 分配 " << size << " 字节\n";
return std::malloc(size);
}
<p>void operator delete(void* ptr) {
std::cout << "[全局] 释放内存\n";
std::free(ptr);
}</p>注意: 全局重载会影响所有 new/delete 调用,容易引发问题,除非有特殊需求(如内存监控),否则不推荐。
可以将重载的 new 指向一个预分配的内存池,提高频繁分配小对象的性能:
static char memoryPool[1024];
static size_t offset = 0;
<p>void<em> operator new(size_t size) {
if (offset + size <= 1024) {
void</em> ptr = memoryPool + offset;
offset += size;
return ptr;
} else {
return std::malloc(size); // 回退到默认
}
}</p><p>void operator delete(void* ptr) {
// 内存池中的对象不真正释放
if (ptr < memoryPool || ptr >= memoryPool + 1024) {
std::free(ptr);
}
}</p>这只是一个简化示例,实际内存池需要更复杂的管理(如空闲链表、对齐处理等)。
基本上就这些。通过重载 new/delete,你可以精细控制内存行为,但要确保配对正确、异常安全,并理解其作用范围。不复杂但容易忽略细节。
以上就是怎样实现自定义内存分配器 重载new运算符示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号