Chinaunix首页 | 论坛 | 博客
  • 博客访问: 501679
  • 博文数量: 174
  • 博客积分: 130
  • 博客等级: 入伍新兵
  • 技术积分: 587
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-12 19:39
文章分类

全部博文(174)

文章存档

2018年(2)

2016年(10)

2015年(6)

2014年(31)

2013年(92)

2012年(33)

我的朋友

分类: 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;
}


阅读(491) | 评论(0) | 转发(0) |
0

上一篇:TCP状态转换

下一篇:零长度数组的妙用

给主人留下些什么吧!~~