helpstudy的ChinaUnix博客
helpstudy
全部博文(174)
2018年(2)
2016年(10)
2015年(6)
2014年(31)
2013年(92)
2012年(33)
fitzyu
你看软人
丸喵喵
Bsolar
浪花小雨
messagez
tomcodin
可怜的猪
IT大咖
分类: C/C++
2013-03-12 16:06:28
原文地址:重载new与delete 作者:zyd_cu
#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;}
上一篇:TCP状态转换
下一篇:零长度数组的妙用
登录 注册