YunNotesydzhang.blog.chinaunix.net
zyd_cu
@HUST张友东 work@taobao zyd_com@126.com
全部博文(251)
2014年(10)
2013年(20)
2012年(22)
2011年(74)
2010年(98)
2009年(27)
NXZ2018
no_error
CodeLZY
feng1991
silence0
lemon小
upon_88
镇水铁牛
knull
WYN_123
guoyan11
shanck
yangzhid
xinfan
Sea05973
zma1111
leoncapt
yttzoey
分类: C/C++
2010-09-26 19:57:54
#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;}
上一篇:C++虚函数机制解析
下一篇:挂载点不一定是目录
登录 注册