#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;
}
|