文档章节

C++ new和delete重载

吃一堑消化不良
 吃一堑消化不良
发布于 2016/10/14 11:05
字数 571
阅读 18
收藏 1

一、重载new/delete的基本格式

//重载new格式如下:
void *operator new (size_t size)
{
  .......//完成分配工作
  return pointer_to_memory;
}

//重载delete格式如下:
void operator delete(void *p)
{
  ......//释放由p指向的存储空间
}

二、局部重载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;
}

三、全局重载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;
}

 

本文转载自:http://blog.163.com/hbu_lijian/blog/static/126129153201211510361484/

上一篇: C++ STL 总结
下一篇: C++ 定位New
吃一堑消化不良
粉丝 28
博文 188
码字总数 112947
作品 0
浦东
程序员
私信 提问
重载new与delete之后,是否对标准库有效?

请问,如果我在C++工程里重载了一个全局的new与delete之后。 那么STL标准库与Qt类库里对内存的申请与释放会不会调用重载的new与delete? 如果不能,那我该怎么做才能让工程里的内存申请都按照...

临峰不畏
2013/03/15
367
3
malloc和new有什么区别

malloc和new有以下不同: new、delete是操作符,可以重载,只能在c++中使用。 malloc、free是函数,可以覆盖,c、c++中都可以使用。 new可以调用对象的构造函数,对应的delete调用相应的析构...

夏雪冬日
2012/12/11
0
0
C# vs C++之二:GC vs RAII

C# vs C++之二:GC vs RAII 资源管理 C中资源管理极为繁琐易错,大多复杂C系统都面临内存泄露、悬挂指针等问题 一方面由底层语言特点决定;另一方面也由于C语言特性相对较少,严重依赖程序员...

ddatsh
2011/06/28
1K
6
c++ 中的重载全局new,delete

最近做一个小项目,对c++又有很多新的理解。实在不的不让人发出感叹,c++太强大了,绝对不是一朝一夕就可以领悟她的内涵的。 首先我们要清楚,为什么我们要重载new,和delete了?这还不是指针...

shzwork
05/13
0
0
Design Pattern - Proxy

Proxy模式真心是一个比较精巧的模式, 尤其通过C++重载运算符(& ->),让你瞬间对C++的感情重归于好,忘记它的库或者框架的缺乏之痛苦.(另外一个令其他高级语言目瞪的是重载new/delete,来管理大块...

woodo
2014/04/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
5
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
5
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
8
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部