在类成员中重载new和delete, 必须声明为static类型,这是因为,在new的时候,对象并没有constructor或destructor, 不存在
this指针,所以利用static函数的特性就可以正确的重载new和delete作为成员函数。
即便不声明为static,那么编译器会自动编译为static静态函数.
如下类:
// 头文件
#pragma once
#include <string>
using namespace std;
class ForbidHeapObject
{
public:
ForbidHeapObject(void);
~ForbidHeapObject(void);
string GetReason()
{
string reason = "";
reason.append("Because new and delete function !");
return reason;
}
public:
/*static*/ void* operator new(size_t size);
/static/ void operator delete(void *ptr);
static void IncretTest();
private:
int new_num; // static int new_num
};
// .cpp实现
#include "stdafx.h"
#include "ForbidHeapObject.h"
#include <iostream>
using namespace std;
// int ForbidHeapObject::new_num = 0;
ForbidHeapObject::ForbidHeapObject(void)
{
cout << "constructor" << endl;
new_num = 0;
}
ForbidHeapObject::~ForbidHeapObject(void)
{
}
void* ForbidHeapObject::operator new(size_t size)
{
new_num++;
return NULL;
}
void ForbidHeapObject::operator delete(void *ptr)
{
new_num--;
}
void ForbidHeapObject::IncretTest()
{
new_num++;
}
// vs2012
// .cpp测试
ForbidHeapObject *b = new ForbidHeapObject(); //如果new_num变量类型不为static, 编译不能通过
// 如果new_num变量声明为static, 则无论重载operator new/ operator delete,均能通过编译