Chinaunix首页 | 论坛 | 博客
  • 博客访问: 854915
  • 博文数量: 254
  • 博客积分: 5350
  • 博客等级: 大校
  • 技术积分: 2045
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 13:27
文章分类

全部博文(254)

文章存档

2015年(1)

2014年(9)

2013年(17)

2012年(30)

2011年(150)

2010年(17)

2009年(28)

2008年(2)

分类: C/C++

2011-11-25 11:05:07

/* overnew.cpp
*重载new 操作符
*为类对象分配空间,可以是磁盘空间,
*使用容器对象或只是把对象放到全局缓冲区中
*/
#include
#include //need size_t

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操作符可以抛出异常来表示有问题。。。
阅读(816) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~