*重载new 操作符
*为类对象分配空间,可以是磁盘空间,
*使用容器对象或只是把对象放到全局缓冲区中
*/
#include
#include
using namespace std;
#define BUFSIZE 512
class BrandNew {
private:
int value;
int mylocation;
public:
BrandNew(int arg);
int GetValue()const { return value; }
int GetLocation()const { return mylocation; }
void * operator new(size_t size); //new 操作符的统一定义模式
};
char buf[BUFSIZE]; //our own memory storage array
int Tindex; //Index into global buf[]
int main()
{
cout << "Creating local instance " << endl;
BrandNew b1(10);
cout << "b1 == " << b1.GetValue() << endl;
BrandNew * b2 = new BrandNew(20);
BrandNew * b3 = new BrandNew(30);
BrandNew * b4 = new BrandNew(40);
BrandNew * b5 = new BrandNew(50);
cout << "*b2 == " << b2->GetValue() << endl;
cout << "*b3 == " << b3->GetValue() << endl;
cout << "*b4 == " << b4->GetValue() << endl;
cout << "*b5 == " << b5->GetValue() << endl;
int b4index = b4->GetLocation();
cout << "Location of object b4 == buf["
<< b4index << "]" << endl;
return 0;
}
BrandNew::BrandNew(int arg):value(arg)
{
cout << "Inside constructor" << endl;
mylocation = Tindex; //save global index in object
}
void * BrandNew::operator new(size_t size)
{
cout << "Inside overload new. size == " << size << endl;
if (index >= BUFSIZE - sizeof(BrandNew))
return 0; //or throw an exception here
else {
int k = Tindex; //save global index
Tindex += sizeof(BrandNew); //Increment index
return &buf[k]; //return reference to object
}
}
调试信息
b1是系统分配的堆空间,但b2-b5指针是指向重载后自定义的一块栈内存空间
b1地址:
程序运行时b1直接调用构造函数初始化,b2-b5指针先调用new函数获取分配的空间,再调用构造函数,按this指针传递的地址初始化类的实例。
由于自定义的是一块临时栈空间数组,此程序可以直接返回,不用定义删除操作;但大多数情况下重载
new操作符需要重载delete操作符
在类中增加
//void operator delete(void * p, size_t size); //指针p是对象地址,长度参数
//size 在这里可省
void operator delete(void * p);
定义如下:
void BrandNew::operator delete(void * p)
{
cout << "Deleting object at " << p << endl;
}
这样就可以使用 delete p2; 删除指针对象了。。
重载的new,delete操作符可以抛出异常来表示有问题。。。