#include <iostream> #include <cstdlib> using namespace std;
/* 重载new应返回void*类型,如果内存分配请求成功,就返回指向内存的指针; * 如果失败,则遵循规定抛出一个std::bad_alloc类型的异常 * 重载operator new需要注意的一些问题,参见: * http://blog.csdn.net/xushiweizh/archive/2006/11/19/1395783.aspx * 重载delete以void*为参数, */
/* 重载了全局的new操作符 */ void* operator new (unsigned int size) { cout << "::new" << endl; cout << size << endl; if(!size) size = 1; void *mem = malloc(size); cout << mem << endl; return mem; }
/* 重载了全局的delete操作符 */ void operator delete (void *ptr) { cout << "::delete" << endl; cout << ptr << endl; if(!ptr) return; free(ptr); }
class Point { public: Point(int x = 1, int y = 1) { this->x = x; this->y = y; } ~Point() {};
/* 重载类Point的new操作符 */ void* operator new (unsigned int size) { /* Point类可能会被继承,派生类使用继承的new * 可能导致错误,将这些情况交给全局的new处理 */ if(size != sizeof(Point)) return ::operator new(size);
cout << "Point::new" << endl; cout << size << endl; if(!size) size = 1; void *mem = malloc(size); cout << mem << endl; return mem; }
/* 重载类Point的delete操作符 */ void operator delete (void *ptr) { /* 对于空指针,不进行处理 */ if(ptr == NULL) return;
cout << "Point::delete" << endl; cout << ptr << endl; if(!ptr) return; free(ptr); }
/* 重载类Point的new[]操作符 */ void* operator new[] (unsigned int size) { cout << "Point::new" << endl; cout << size << endl; if(!size) size = 1; void *mem = malloc(size); cout << mem << endl; return mem; }
/* 重载类Point的delete[]操作符 */ void operator delete[] (void *ptr) { cout << "Point::delete" << endl; cout << ptr << endl; if(!ptr) return; free(ptr); }
/* 重载<<操作符 */ friend ostream& operator << (ostream& s, Point& p); private: int x; int y; };
ostream& operator << (ostream& s, Point& p) { s << p.x << " " << p.y; return s; }
int main() { cout << "sizeof(Point) = " << sizeof(Point) << endl;
/* 使用类的new操作符 * 一次申请一个元素 * 传入new的size值与实际需要的空间相等 */ Point *p = new Point; cout << p << endl;
cout << endl << "---------------------" << endl << endl;
/* 一次申请多个元素时 * 实际传入new的size值比需要的空间多4个字节 * 这第一个字节用于存储分配的个数 * 用户实际使用的空间从第二个字节开始 */ Point *p2 = new Point[2]; cout << p2 << endl; int *intp = (int*)p2; delete p;
/* 连续的16个字节存储的两个Point * 构造Point时默认x、y为1 * 以下四条语句输出均为1 */ cout << *intp << endl; cout << *(intp + 1) << endl; cout << *(intp + 2) << endl; cout << *(intp + 3) << endl;
/* 分配的起始地址前一个字节存储分配个数 */ cout << *(intp - 1) << endl;
/* 释放p2指向的内存空间,传入地址第一字节为分配的个数(2) * 根据申请单个元素空间和申请多个元素空间的不同,故释放 * 时使用的操作符要与申请时使用的对应 */ delete []p2;
cout << endl << "---------------------" << endl << endl;
/* 使用重载的全局new 与 delete */ int *ip = new int; delete ip;
return 0; }
|