C++ new和delete重载
什么是new和delete运算符重载?
在C++中,new
和delete
是用于动态内存分配和释放的运算符。当我们使用new
创建对象时,它会调用两个操作:分配内存和调用构造函数。类似地,delete
也执行两个操作:调用析构函数和释放内存。
重载这些运算符可以让我们自定义对象的内存分配和释放策略,实现更加灵活高效的内存管理。
备注
重载new
和delete
运算符允许我们:
- 跟踪内存分配
- 实现内存池
- 处理特定的内存分配需求
- 提高程序的性能
为什么需要重载new和delete?
重载new
和delete
的常见原因包括:
- 性能优化:标准的
new
和delete
可能不够高效,特别是对于频繁分配和释放小对象的情况。 - 内存泄漏检测:通过添加跟踪代码,可以检测内存泄漏。
- 特殊内存需求:某些应用可能需要对象在特定的内存区域分配。
- 内存对齐:为了性能或硬件要求,可能需要特定的内存对齐方式。
- 实现内存池:减少内存碎片,提高分配和释放速度。
new和delete运算符重载的形式
全局重载
重载全局的new
和delete
会影响所有使用这些运算符的代码:
// 全局重载new
void* operator new(size_t size) {
std::cout << "全局重载new: 分配 " << size << " 字节" << std::endl;
void* ptr = malloc(size);
if (!ptr) throw std::bad_alloc();
return ptr;
}
// 全局重载delete
void operator delete(void* ptr) noexcept {
std::cout << "全局重载delete: 释放内存" << std::endl;
free(ptr);
}
类级别重载
在类内部重载new
和delete
只会影响该类及其派生类的对象:
class MyClass {
public:
MyClass() {
std::cout << "MyClass构造函数调用" << std::endl;
}
~MyClass() {
std::cout << "MyClass析构函数调用" << std::endl;
}
// 重载类的new运算符
void* operator new(size_t size) {
std::cout << "MyClass::operator new: 分配 " << size << " 字节" << std::endl;
void* ptr = malloc(size);
if (!ptr) throw std::bad_alloc();
return ptr;
}
// 重载类的delete运算符
void operator delete(void* ptr) noexcept {
std::cout << "MyClass::operator delete: 释放内存" << std::endl;
free(ptr);
}
};