C++ new和delete重载

2012-02-15 23:25:33|  分类: C/C++|举报|字号 订阅

 
 
      首先,new和delete是运算符,重载new和delete是可能的。这样做的原因是,有时希望使用某种特殊的动态内存分配方法。例如,可能有些分配子程序,他们的堆已耗尽,自动开始把一个磁盘文件当虚存储使用,或者用户希望控制某一片存储空间的分配等。
重载new和delete的格式如下:
void *operator new (size_t size)
{
  .......//完成分配工作
  return pointer_to_memory;
}

void operator delete(void *p)
{
  ......//释放由p指向的存储空间
}
1.局部重载new和delete(可以使用成员函数和友元函数两种方式重载)
      使用new分配某个重载了new的累的对象空间时,先调用new的重载函数,再调用该类的构造函数,如果该类的构造函数有参数要求,则必须给出对应的实参。
      使用了delete释放某个重载了delete的累的对象空间时,先调用类的析构函数,然后再调用重载的delete函数。
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

class three_d
{
private:
    int x,y,z;
public:
    three_d(int a,int b,int c);
    ~three_d()
    {
        cout << "Destructing\n";
    }
    void *operator new(size_t size);
    void operator delete(void *p);
    friend ostream & operator <<(ostream &stream,three_d obj);
};

three_d::three_d(int a,int b,int c)
{
    cout << "Constructing\n";
    x = a;
    y = b;
    z = c;
}

void *three_d::operator new(size_t size)
{
    cout << "in threee_d new\n";
    return malloc(size);
}

void three_d::operator delete(void *p)
{
    cout << "in three_d delete\n" ;
    free(p);
}

ostream &operator <<(ostream &os,three_d obj)
{
    os << obj.x << ",";
    os << obj.y << ",";
    os << obj.z << "\n";
    return os;
}

int main(int argc,char *argv[])
{
    three_d *p = new three_d(1,2,3);
    three_d *p1 = new three_d(4,5,6);
    if(!p || !p1)
    {
        cout << "Allocation failure" << endl;
        return 1;
    }
    cout << *p << *p1;
    delete p;
    delete p1;
    int *pnum;
    pnum = new int;
    *pnum = 0;
    cout << "num = " << *pnum << endl;
    delete pnum;
    cout << "Application Run Successfully!" << endl;
    return 0;
}
2.全局重载new和delete
      可以在任何类说明之外重在new和delete,使它们成为全局的。当new和delete被重载为全局时,C++原来的new与delete被忽略,并且重载的运算符用于所有类型(包括标准型和用户定义类型)的分配要求。
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

class three_d
{
private:
    int x,y,z;
public:
    three_d(int a,int b,int c);
    ~three_d()
    {
        cout << "Destructing\n";
    }
    friend ostream & operator <<(ostream &stream,three_d obj);
};

three_d::three_d(int a,int b,int c)
{
    cout << "Constructing\n";
    x = a;
    y = b;
    z = c;
}

void *operator new(size_t size)
{
    cout << "in threee_d new\n";
    return malloc(size);
}

void operator delete(void *p)
{
    cout << "in three_d delete\n" ;
    free(p);
}

ostream &operator <<(ostream &os,three_d obj)
{
    os << obj.x << ",";
    os << obj.y << ",";
    os << obj.z << "\n";
    return os;
}

int main(int argc,char *argv[])
{
    three_d *p = new three_d(1,2,3);
    three_d *p1 = new three_d(4,5,6);
    if(!p || !p1)
    {
        cout << "Allocation failure" << endl;
        return 1;
    }
    cout << *p << *p1;
    delete p;
    delete p1;
    int *pnum;
    pnum = new int;
    *pnum = 0;
    cout << "num = " << *pnum << endl;
    delete pnum;
    cout << "Application Run Successfully!" << endl;
    return 0;
}

C++ new和delete重载的更多相关文章

  1. [百度空间] [原] 全局operator delete重载到DLL

    由于很久没有搞内存管理了,很多细节都忘记了今天项目要用到operator delete重载到DLL,发现了问题,网上搜索以后,再对比以前写的代码,发现了问题:原来MSVC默认的operator new ...

  2. new和delete重载

    1. 简介 new/delete关键字,其本质是预定义的操作符,因此支持重载 默认new和delete的行为: new:    ①获取内存空间(默认为堆空间):②在获取的空间中调用构造函数创建对象 d ...

  3. [GeekBand] C++ 内存分布—— new和delete重载的实现及分析

    本文参考文献:GeekBand课堂内容,授课老师:侯捷 :深度探索C++对象模型(侯捷译) :网络资料: http://www.leavesite.com/geekband-cpp-5.html ht ...

  4. new/delete重载

    在c++中,有时我们需要在运行阶段为一个变量分配未命名的内存,并使用指针来访问它,这里就可以用到new关键字.另外需要指出的是,new分配的内存块通常与常规变量分配的内存块不同,常规变量的值都储存在被 ...

  5. 走进C++程序世界-----operator new delete 重载

     在C++ 的世界里,new 和delete 是keyword.而在C的世界里相相应的malloc和free是函数,关键C++的new和delete分析,详见前面的章节.这里就不在过多的介绍了.链接. ...

  6. 重载new和delete

    当我们创建一个new表达式时,会发生两件事.首先使用operator new()分配内存,然后调用构造函数.在delete表达式里,调用了析构函数,然后使用operator delete()释放内存. ...

  7. 重载全局new/delete实现内存检测

    下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用new和delete运算符时就会调用重载过的operator ...

  8. 重载new和delete运算符

    内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内 ...

  9. 运算符重载之new与delete

    关于new/delete,援引C++ Primer中的一段话: 某些应用程序对内存分配有特殊的要求,因此我们无法直接将标准的内存管理机制直接应用于这些程序.他们常常需要自定义内存分配的细节,比如使用关 ...

随机推荐

  1. win7 iis7 asp.net 编译器错误消息: CS0016:

    编译器错误消息: CS0016: 未能写入输出文件“c:/Windows/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/root ...

  2. 双11抢券,写一个自动打开页面的html,仅仅是设定时间打开抢券的页面

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  3. [日常] Linux使用diff来比较目录

    Linux diff比较两个目录的不同: diff dir1 dir2  -urNaq -a  --text  Treat all files as text. -u  -U NUM  --unifi ...

  4. 去把bilibili的返回顶点锚点扒了下来

    今天闲来无事看着刷着bilibili对那锚点标记觊觎已久,下决心将其收为己用,遂动手. 个人主推Firefox+firebug查看网页代码.我用的是夜壶(nightly),就火狐的每日更新版(建议不用 ...

  5. git ssh key生成

    重装系统后,需要重新安装git,ssh key便是遇到的其中一个问题,具体解决办法如下: 1.安装好git客户端后,查看本地是否有.ssh文件,命令如下:mkdir ~/.ssh 2.如果没有该文件, ...

  6. JavaScript document和window属性及方法详解

    [document对象] 该对象是window和frames对象的一个属性,是显示于窗口或框架内的一个文档. 属性 alinkColor 活动链接的颜色(ALINK)  anchor 一个HTMI锚点 ...

  7. LOJ #2985. 「WC2019」I 君的商店

    传送门 搬题解QwQ 首先最大值一定为 \(1\),直接扫一遍两两比较 \(O(2N)\) 求出最大值 设最大值位置为 \(a\),对于任意两个没有确定的位置 \(x,y\) 询问 \([a,x+y] ...

  8. 转:xdebug在linux下的安装教程

    原文:xdebug在linux下的安装教程 [注意,本人是PHP7.1.7 Nginx ,第7步没有做,但是xdebug.so就已经在PHP的扩展文件夹里面了.目录是phpinfo的extension ...

  9. EOS开发经验总结——不定期持续更新中

    一.新手安装mysql乱码问题 1.数据库安装时设置默认编码格式为UTF8或者打开mysql安装目录下my.ini,变更default-character-set=utf8: 2.打开EOS的Gove ...

  10. CentOS7系列--1.3CentOS7用户管理

    CentOS7用户管理 1. 添加用户 [root@centos7 ~]# useradd jack [root@centos7 ~]# passwd jack Changing password f ...