以成员函数的形式重载 new 运算符:
void* ClassName::operator new(size_t sz) {
// TODO;
}
以全局函数的形式重载 new 运算符:
void* operator new(size_t sz) {
// TODO;
}
两种重载形式的返回值相同,都是void *类型,并且都有一个参数,为size_t类型。
在重载 new 或 new[] 时,无论是作为成员函数还是作为全局函数,它的第一个参数必须是 size_t 类型。
对于 new 而言 size_t 表示的是要分配空间的大小,对于 new[] 的重载函数而言,size_t 则表示所需要分配的所有空间的总和。
以成员函数的形式重载 delete 运算符:
void ClassName::operator delete(void* ptr) {
// TODO;
}
以全局函数的形式重载 delete 运算符:
void operator delete(void* ptr) {
// TODO;
}
两种形式的重载返回值都是void类型,并且都必须有一个void类型的指针作为参数,该指针指向需要释放的空间。
代码示例:
#include <iostream>
#include <string>
#include <memory>
void* operator new(size_t sz) {
std::cout << "reload global operator new" << std::endl;
return malloc(sz);
}
void operator delete(void* ptr) {
std::cout << "reload global operator delete" << std::endl;
free(ptr);
}
class Test {
public:
int a;
int b;
Test() {
std::cout << "Test Constructor" << std::endl;
}
~Test() {
std::cout << "Test ~Constructor" << std::endl;
}
void* operator new(size_t sz) {
std::cout << "Test reload operator new" << std::endl;
return malloc(sz);
}
void operator delete(void* ptr) {
std::cout << "Test reload operator delete" << std::endl;
free(ptr);
}
};
int main()
{
int* ptr = new int;
Test* ptr2 = new Test;
delete ptr;
delete ptr2;
return 0;
}
输出结果:
reload global operator new
Test reload operator new
Test Constructor
reload global operator delete
Test ~Constructor
Test reload operator delete