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

以下来研究下关于new 和delete的重载。

 1、对照使用重载和未使用重载

 未使用“

  1. /*File : operator_new.cpp
  2. *Auth : sjin
  3. *Date : 2014-04-27
  4. *Mail : 413977243@qq.com
  5. */
  6.  
  7. #include <iostream>
  8.  
  9. using namespace std;
  10.  
  11. class test {
  12. public:
  13. test(){cout << "*****构造test()*****"<< endl;};
  14. ~test(){cout << "+++++析构test()+++++"<< endl;};
  15. };
  16.  
  17. int main()
  18. {
  19. test * x = new test;//运行分配空间,再运行析构函数
  20. delete x;//先运行析构函数,在释放空间
  21. }

使用重载后,

  1. /*File : operator_new.cpp
  2. *Auth : sjin
  3. *Date : 2014-04-27
  4. *Mail : 413977243@qq.com
  5. */
  6.  
  7. #include <iostream>
  8.  
  9. using namespace std;
  10.  
  11. char mem[10000] = {'\0'};
  12. int pos = 0;
  13.  
  14. class test {
  15. public:
  16. test(){cout << "*****构造test()*****"<< endl;};
  17. ~test(){cout << "+++++析构test()+++++"<< endl;};
  18.  
  19. public:
  20. void * operator new(size_t bytes){
  21. cout << "------new test()------" << endl;
  22. int alloc = pos;
  23. pos += bytes;
  24. return (mem + alloc);
  25. };
  26.  
  27. void operator delete(void *){
  28. cout << "------delete test()------" << endl;
  29.  
  30. };
  31. };
  32.  
  33. int main()
  34. {
  35. test * x = new test;
  36.  
  37. delete x;
  38. }

  1. /*File : operator_new.cpp
  2. *Auth : sjin
  3. *Date : 2014-04-27
  4. *Mail : 413977243@qq.com
  5. */
  6.  
  7. #include <iostream>
  8.  
  9. using namespace std;
  10.  
  11. char mem[10000] = {'\0'};
  12. int pos = 0;
  13.  
  14. class test {
  15. public:
  16. test(){cout << "*****构造test()*****"<< endl;};
  17. ~test(){cout << "+++++析构test()+++++"<< endl;};
  18.  
  19. public:
  20. void * operator new(size_t bytes){
  21. cout << "------new test()------" << endl;
  22. int alloc = pos;
  23. pos += bytes;
  24. return (mem + alloc);
  25. };
  26.  
  27. void operator delete(void *){
  28. cout << "------delete test()------" << endl;
  29.  
  30. };
  31. };
  32.  
  33. int main()
  34. {
  35. test * x = new test;
  36.  
  37. delete x;
  38.  
  39. x = new test[3];
  40.  
  41. delete [] x;//这里对数组释放,须要注意
  42. }

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. char mem[10000] = {'\0'};
  6. int pos = 0;
  7.  
  8. class test {
  9. public:
  10. test(){cout << "*****构造test()*****"<< endl;};
  11. ~test(){cout << "+++++析构test()+++++"<< endl;};
  12.  
  13. public:
  14. void * operator new(size_t bytes){
  15. cout << "------new test()------" << endl;
  16. int alloc = pos;
  17. pos += bytes;
  18. return (mem + alloc);
  19. };
  20.  
  21. void operator delete(void *){
  22. cout << "------delete test()------" << endl;
  23.  
  24. };
  25.  
  26. void * operator new[](size_t bytes){
  27. cout << "------new test()------" << endl;
  28. int alloc = pos;
  29. pos += bytes;
  30. return (mem + alloc);
  31. };
  32.  
  33. void operator delete[](void *){
  34. cout << "------delete test()------" << endl;
  35.  
  36. };
  37. };
  38.  
  39. int main()
  40. {
  41. test * x = new test;
  42.  
  43. delete x;
  44.  
  45. x = new test[3];
  46.  
  47. delete [] x;
  48. }

对new 和delete 函数的重载能够用来检測 内存泄露的情况。

 

 

 

走进C++程序世界-----operator new delete 重载的更多相关文章

  1. 走进C++程序世界-----继承和派生(2)

    覆盖基类的函数 覆盖基类函数顾名思义就是在派生类中对基类的函数进行的重新定义.这里将会讲到下面的2个知识点: 1.隐藏基类的方法 2.调用基类的方法(隐式和显示调用基类的方法) /* *derive2 ...

  2. 走进C++程序世界-----函数相关(全局变量)

    全局变量 在函数外面定义的变量的作用域为全局,在程序的任何函数中都可用.与全局变量同名的局部变量不会修改全局变量的值,但会隐藏它.如果函数中有一个与全局变量同 名的局部变量时,则在函数中使用该名称时, ...

  3. 走进C++程序世界------IO标准库介绍

    流概述    流是C++标准的组成部分,流的主要目标是,将从磁盘读取文件或将输入写入控制台屏幕的问题封装起来,创建流后程序猿就能够使用它.流将负责处理全部的细节. IO类库 在C++输入、输出操作是通 ...

  4. 走进C++程序世界------异常处理

    一. 概述 C++自身有着很强的纠错能力,发展到现在,已经建立了比較完好的异常处理机制. C++的异常情况无非两种,一种是语法错误.即程序中出现了错误的语句,函数.结构和类,致使编译程序无法进行.还有 ...

  5. 走进C++程序世界------继承和派生

    继承和派生 继承是面向对象编程语言的最重要方面之一,正确的使用继承可编写出设计良好,容易于维护和扩展的应用程序.下面是在其他博客中的总结: ****************************** ...

  6. 走进C++程序世界-------类的定义和使用(数据成员和方法成员,析构函数,构造函数,内联实现)

    类的成员简介 在C++中,可以通过声明一个类来穿件一种新的类型.类将一组变量(他们的类型通常不同)和一组相关的函数组合在一起.类可以有各种类型的变量组成,还可以包含其他类对象.成员变量称为数据成员它们 ...

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

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

  8. 重载operator new delete函数

    可以重载global的operator new delete 函数,细节如下: MyNewDelete.h #pragma once #include <stdlib.h> #includ ...

  9. C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】

    C#7.2——编写安全高效的C#代码 2018-11-07 18:59 by 沉睡的木木夕, 123 阅读, 0 评论, 收藏, 编辑 原文地址:https://docs.microsoft.com/ ...

随机推荐

  1. [洛谷P1972][SDOI2009]HH的项链

    题目大意:给你一串数字,多次询问区间内数字的种类数 题解:莫队 卡点:洛谷数据加强,开了个$O(2)$ C++ Code: #include <cstdio> #include <a ...

  2. linux下源代码分析和阅读工具比较

    Windows下的源码阅读工具Souce Insight凭借着其易用性和多种编程语言的支持,无疑是这个领域的“带头大哥”.Linux/UNIX环境下呢?似乎仍然是处于百花齐放,各有千秋的春秋战国时代, ...

  3. 为基于busybox根文件系统的ARM嵌入式Linux交叉编译dropbear使能SSH

    原创作品,允许转载,转载时请务必以超链接形式标明文章.作者信息和本声明,否则将追究法律责任. 最近使用busybox为基于ARM的板卡定制了一个极简单的根文件系统,由于busybox仅支持telnet ...

  4. 【HDU 2594 Simpsons' Hidden Talents】

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  5. BZOJ 2103/3302/2447 消防站 树的重心【DFS】【TreeDP】

    2103: Fire 消防站 Time Limit: 30 Sec  Memory Limit: 259 MBSubmit: 157  Solved: 116[Submit][Status][Disc ...

  6. 搭建自己的YUM源HTTP服务器

    createrepo是linux下的创建仓库的软件包.create是创建的意思,repo是repository的缩写,是仓库的意思.yum(Yellowdog Updater,Modified)主要的 ...

  7. 为IE和chrome编写单独的样式

    flex布局在IE10上不支持,为IE10编写特定的样式可以用判断navigator.userAgent 的方法 var doc = document.documentElement; doc.set ...

  8. Android横竖屏总结(转)

    Android横竖屏总结(转) 横竖屏切换后Activity会重新执行onCreat函数,但是在Android工程的Mainfest.xml中加入android:screenOrientation=& ...

  9. js Event对象

    (事件阶段)Event Phases Event对象在event第一次触发的时候被创建出来,并且一直伴随着事件在DOM结构中流转的整个生命周期.event对象会被作为第一个参数传递给事件监听的回调函数 ...

  10. [洛谷1972][SDOI2009]HH的项链

    题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...