内存操作符 new 和 delete 系统本身就提供了非常稳固的方法,很少会有情况用到自己重载的 new 和 delete,除非是想实现什么特别的功能,比如在申请内存后自动填入什么数据等等,当然这并不是本文讨论的重点,本文的重点是记录如何重载这两个操作符。

#include
#include
#include

using namespace std;

// new delete
void* operator new(size_t size)
{
void* p = malloc(size);
// 个性化定制,在申请完内存后将内存数据清0
memset(p, 0, size);
cout << “new p = “ << p << “\tsize = “ << size << endl;
return p;
}

void operator delete(void* p)
{
cout << “free p = “ << p << endl;
free(p);
}

// new delete 组
void* operator new[](size_t size)
{
void* p = malloc(size);
memset(p, 0, size);
cout << “new[] p = “ << p << “\tsize = “ << size << endl;
return p;
}

void operator delete[](void* p)
{
cout << “free[] p = “ << p << endl;
free(p);
}

class A
{
public:
A(){cout << “A constructor” << endl;}
~A(){cout << “A destructor” << endl;}

friend void* operator new(size_t size);
friend void operator delete(void* p);
friend void* operator new[](size_t size);
friend void operator delete[](void* p);

private:
int data;
};

int main(int argc, char* argv[])
{
A *p = new A[5];
delete [] p;
return 0;
}