//=============================================================================

#ifdef _DEBUG // 判断是否定义_DEBUG
#define new DEBUG_NEW // 定义调试new宏,取代new关键字
#undef THIS_FILE // 取消THIS_FILE的定义
static char THIS_FILE[] = __FILE__; // 定义THIS_FILE指向文件名
#endif // 结束

//=============================================================================
// 解释:

// 上段代码基本含义:
// 调试状态下编译,修改两个符号的定义。作用就是防止内存泄露和减小程序编译开销。

THIS_FILE 是一个 char 数组全局变量,字符串值为当前文件的全路径,调试状态中当程序出错时出错处理代码可用这个变量告诉你是哪个文件中的代码有问题。
DEBUG_NEW 可以定位内存泄露并且跟踪文件名和行号。

ANSI C 的6个宏:
__FILE__  // 为预编译器常量,返回当前编译的文件名;
__LINE__  // 编译器正在编译文件的第几行;
__DATE__  // 返回当前的日期。如:Jul-20-2004;
__TIME__  // 返回当前的时间。如:hh:mm:ss; 
__TIMESTAMP__  // 返回时间戳信息。在太平洋标准的时间内无论本地时间和 CL.EXE 的运行位置在计算机上的时区。
__STDC__  // 条件编译,意思是:如果定义了标准C或c++,那么编译这句话后面直到#endif以前的源代码。
_STDC__ cplusplus // 这两个都是标准宏,_STDC_表示是是否符合标准C;_cplusplus表示是否是C++。

为了检测内在泄露, Debug 版本的 new 附加上了调用 new 的文件名与调用所在的行号信息, 这是通过 __FILE__ 和 __LINE__ 来实现的, 这两个属于预定义的内部宏,
如果不想重写整个程序来使用 DEBUG_NEW 代替 new,则可以在源文件中定义下面的宏:

#define new DEBUG_NEW

当进行对象转储时,用 DEBUG_NEW 分配的每个对象均将显示被分配到的文件和行号,这样可以查明内存泄漏源。

//-----------------------------------------------------

static char THIS_FILE[] = __FILE__; 解释:

在 DEBUG_NEW 的定义中没有直接使用 __FILE__,而是用了 THIS_FILE,其目的是为了减小目标文件的大小。
多次使用__FILE__宏,虽然得到字符串的内容相同,但是可能地址不同,即同一个字符串常量多次用到时占用不同的地址,这样导致需要的内存增加了。
假设在某个 cpp 文件中有 100 处使用了new,如果直接使用__FILE__,那编译器会产生100个常量字符串,这100个字符串都是这个cpp文件的路径名,最后生成的目标文件会很大,显然十分冗余。
如果使用THIS_FILE,编译器只会产生一个常量字符串,那 100 处 new 的调用使用的都是指向常量字符串 THIS_FILE 指针。

在MFC中,可以使用 DEBUG_NEW 宏代替 new 运算符来帮助定位内存泄漏。在程序的“Debug”版本中,DEBUG_NEW 将为所分配的每个对象跟踪文件名和行号。
当编译程序的“Release”版本时,DEBUG_NEW 将解析为不包含文件名和行号信息的简单 new 操作。因此,在程序的“Release”版本中不会造成任何速度损失。

//=============================================================================

#ifdef _DEBUG
virtual void AssertValid() const; // 有效的断言
virtual void Dump(CDumpContext& dc) const; // 存储上下文
#endif

//=============================================================================
// 解释:

// 当前编译模式为debug时,省略号里的内容有效。
#ifdef _DEBUG
...
#endif

// 检查可用性,即是否有效。
virtual void AssertValid() const;

// 若未更改,则最终调用CWnd::Dump();输出窗口类名,标题名等一系列信息。
virtual void Dump(CDumpContext& dc) const;

//=============================================================================

感谢原作者的分享!
原文:https://blog.csdn.net/xuhuan_wh/article/details/78474947

关于C++中常用的对DEBUG_NEW、THIS_FILE重定义的说明相关推荐

  1. C++中的重载丶重写丶重定义丶重定向的区别

    C++中的重载丶重写丶重定义丶重定向的区别 分类: C.C++丶C#语言基础2013-05-02 05:43 404人阅读 评论(0) 收藏 举报 C++C重定义重定向重载 先看重载: 重载指的是函数 ...

  2. C++中常用数组及几种数组定义方式

    一,一维数组 1,数组在内存中是连续的内存空间: 2,数组的数据类型必须一致: 数组定义三种方式: 第一种定义 只定义,不初始化: 数组类型 数组名 [数组长度]; int arr[5]; 第二种定义 ...

  3. 8-3:C++继承之继承中的作用域,隐藏,重定义和静态成员

    文章目录 (1):继承中的作用域 (2):友元关系不能被继承 (3):静态成员和继承 (1):继承中的作用域 在学习作用域时,我们说过代码中可以定义在不同作用域中的同名变量,并且输出时会遵循就近原则. ...

  4. 在计算机中常用的数据表示方法有哪些,数据在计算机中的表示方法

    1,2020/5/25,数据在计算机中的表示方法,2,2020/5/25,教学目标:了解计算机内部信息用什么进制表示,为什么要采用这种进制:掌握数制之间的转换,了解存储中几个概念及数据的编码重点及难点 ...

  5. java中常用快捷键的用法

    "文件"菜单中常用命令 Alt+Shift+N 创建新项目.元素或资源 Ctrl+W 关闭当前编辑器 Ctrl+Shift+W 关闭所有编辑器 Alter+Enter 打开所选元素 ...

  6. VC/MFC中常用宏的含义

    VC/MFC中常用宏的含义 Visual C++ MFC 中常用宏的含义(转载)     AND_CATCHAND_CATCH AND_CATCH(exception_class,exception ...

  7. java 中常用的类

    java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l  static double abs(double  a) 获取double 的绝对值 l  sta ...

  8. Asp.NET中常用的一些优化性能的方法

    ASP.NET 的缓存机制相比ASP有很大的改进,本文档除对常用优化方法进行总结介绍外,强调了如何使用ASP.NET的缓存来获得最佳性能. 1:不要使用不必要的session 和ASP中一样,在不必要 ...

  9. Python中常用的数据分析工具(模块)有哪些?

    本期Python培训分享:Python中常用的数据分析工具(模块)有哪些?Python本身的数据分析功能并不强,需要安装一些第三方的扩展库来增强它的能力.我们课程用到的库包括NumPy.Pandas. ...

  10. shell编程系列7--shell中常用的工具find、locate、which、whereis

    shell编程系列7--shell中常用的工具find.locate.which.whereis1.文件查找之find命令语法格式:find [路径] [选项] [操作]选项 -name 根据文件名查 ...

最新文章

  1. 一文读懂 .NET 中的高性能队列 Channel
  2. 图像处理五:python读取图片的几种方式
  3. CIO:互联网IT系统和传统企业IT系统的异同
  4. 「企业架构」TOGAF 和Zachman有什么区别?
  5. Matlab取整函数: fix, floor, ceil, round.
  6. HTML中的img标签无法显示图片的解决方案
  7. 兄弟HL4150cdn恢复出厂设置_兄弟打印机恢复出厂设置
  8. 东芝 rc100 linux,东芝RC100 M.2 NVMe固态硬盘HMB特性解读
  9. 干货!底层视觉研究,我们应该往哪里走?
  10. 如何批量生成Code32条形码
  11. 产品经理与程序员之间的孽缘发展历程
  12. 上映半个月,微博热搜近10次,长歌行的魅力到底在哪 ?
  13. Navicat Premium 12 for Mac 破解
  14. XCTF final noxss
  15. 0.前端简历编写和面试前准备
  16. mybatis从入门到精通(刘增辉著)-读书笔记第五章
  17. Java中super关键字及super()的使用
  18. 金融行业管理解决方案
  19. java.util.ConcurrentModificationException: null异常(已解决,原因出自于Java集合的快速失败机制)
  20. Windows查看文件占用情况、查看程序的dll依赖项

热门文章

  1. 基于安卓平台的软件加固方案的设计与实现_微信支付跨平台软件架构
  2. 网吧用服务器做虚拟化,刀片、无盘、集群、虚拟化,给你一个选择的理由(上)...
  3. 图书管理系统软件测试报告_软件测试新手入门小知识点,一定要牢记
  4. android 禁用跳转动画,android – 禁用ViewPager滚动动画
  5. java replaceall删除中括号和内容_replaceAll()如何同时替换多个不同的字符串(或多个符号)...
  6. matlab元素相同,Matlab:访问所有堆叠结构中的相同元素
  7. java删除指定文件后重新建立文件系统_java file 操作之创建、删除文件及文件夹...
  8. Android stdio安装
  9. java笔试之从单向链表中删除指定值的节点
  10. 统计/var/log/下有多少文件