C++ 的一个 比较晦涩难懂的特点是你可以重载 new 操作符,并且你甚至可以给它附加参数。通常,操作符 new 只接受拟分配对象的大小:
        void* operator new(size_t nAlloc)
        {
            return malloc(nAlloc);
        }
  但你也可以随心所欲附加参数来重载 new 操作符,只要在调用 new 时候提供这些参数即可。在各种应用程序向导(App Wizards)中,这 是 MFC 所做的事情。一个典型的 MFC 程序(.cpp)文件顶部都有下面这样的代码行,通常都由应用程序向导生成:

#ifdef _DEBUG
        #define new DEBUG_NEW
        #undef THIS_FILE
        static char THIS_FILE[] = __FILE__;
        #endif

MFC 将 new 重定义为 DEBUG_NEW。但 DEBUG_NEW 是什么? afx.h 道出了原委:

// (simplified)
        #ifdef _DEBUG
        # define DEBUG_NEW new(THIS_FILE, __LINE__)
        #else
        # define DEBUG_NEW new
        #endif
在 debug 生成模式中,MFC 重载了操作符 new 以获取两个额外的参数,比如:
        void* operator new(size_t nSize,
        LPCSTR lpszFileName, int nLine);
  重载的版本与普通的 new 同样都有表示对象大小的 size 参数,但还增加了两个参数:源文件名称和行数。因此,无论何时,只要你写:
        pfoo = new CFoo(..);
预处理程序便会将它转变为:
        pfoo = new (sizeof(CFoo), THIS_FILE, __LINE__) CFoo(...);
  __FILE__(用来初始化 THIS_FILE)和 __LINE__ 是专用的预处理符号,它保存当前被编译的模块文件名称和行数。 其主要用途是当你的应用程序泄漏时,MFC 能显示一个消息。如:
        Shame on you! You didn''t free the CFoo object in foo.cpp, line 127!
  这对于调试来说,是个巨大的福音。

转载于:https://www.cnblogs.com/sideny/p/3297886.html

DEBUG_NEW和THIS_FILE相关推荐

  1. 编译时遇到如下错误error C2061: syntax error : identifier 'THIS_FILE'

    上午写程序时,加入了前些写的一个类,编译时遇到如下错误: ...error C2061: syntax error : identifier 'THIS_FILE' .../new(35) : err ...

  2. #ifdef _DEBUG #define new DEBUG_NEW #endif的解释

    在用vc时,利用AppWizard会产生如下代码: [cpp] view plain copy print? #ifdef _DEBUG #define new DEBUG_NEW #undef TH ...

  3. VC里的#define new DEBUG_NEW

    以下代码常常在一个类文件的开头出现,是什么意思呢? #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE ...

  4. C++ 文件头 static char THIS_FILE[] = __FILE__

    C++ static char THIS_FILE[] = __FILE__; __FILE__ 为预编译器常量,返回当前编译的文件名,还有比较常用的几个预编译器常量, __LINE__ 编译器在编译 ...

  5. MFC按钮CXPButton类,代码阅读起来还是挺不错的

    在操手MFC的时候,经常会抱怨MFC界面不如其他的框架或语言,比如VB,C#等等,面对MS在系统上的不断更新换代,我们也越来越追求软件的视觉效果,譬如我们会更喜欢win7下的玻璃效果,看起来很炫. 在 ...

  6. VC编写自己构造http协议数据的post上传图片类(MFC环境 带编码转换)(转)

    上次用VC写了个MFC环境下的post数据类,地址: /Html/diannaojishu/2009-10/4905858580.html 这次将这个类进行扩展,可以post图片.但这两个post所使 ...

  7. VC中DDX/DDV自定义

    DDX用于控件与变量的数据交换.DDV用于对数据交换后的变量进行校验,倘若校验失败将抛出异常导致Updata后面部分不能正常执行.必要时需要对Updata的返回值进行判断.     对于数据交换,需要 ...

  8. c语言编一个dll 用message box 弹出一个对话框,Qt学习之路(17): Qt标准对话框之QMessageBox...

    2015-06-25 16:41 下面的是vc6中创建的dll程序|@||@|// TestDll2QT.cpp : Defines the initialization routines for t ...

  9. VC中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法总结。

    C/C++ 预定义宏 例子:C/C++ 预定义宏的取值 C/C++ 预定义宏用途:诊断与调试输出 CRT 的诊断与调试输出:assert, _ASSERT/_ASSERTE, _RPTn/_RPTFn ...

最新文章

  1. Debian 7(Wheezy)下配置Open×××
  2. 计算机辅助诊断系统的应用,AI医疗影像辅助诊断系统
  3. 字体外面怎么加边框_字体处理的6种方法,解决ppt种字体不突出的问题
  4. 使用Entity Framework Core访问数据库(Oracle篇)
  5. vue v2.5.0源码-双向数据绑定
  6. mac编译安装apache+php+mysql开发环境
  7. python mysql批量insert数据_使用python往mysql批量插入数据时,报错not all arguments converted...
  8. Spring Cloud 2020 年路线图
  9. SocksCap代理
  10. 利用无线串口进行单片机通信(基于MK60)
  11. win10 c盘压缩卷只能压出一半?或只能压缩出一点空间的完美解决方案
  12. 三级等保 mysql8.0.24密码策略设置
  13. python科研作图系列-01热力图相关性分析
  14. MLflow机器学习工作流管理使用教程
  15. Javascript里EQ、NE、GT、LT、GE、LE含义
  16. Android_线程_多线程下载
  17. Web3 时代 传统品牌如何玩转 NFT 营销?
  18. 【QGIS入门实战精品教程】4.8:QGIS如何下载SRTM数字高程模型DEM?
  19. Excel 自动画图表
  20. 某985高校学者私自拷贝他人评审的基金申请书,并当自己的去申基金!国自然基金委通报!...

热门文章

  1. 【Linux系统编程应用】 Linux输入子系统(二)
  2. [Qt教程] 第27篇 XML(一)使用DOM读取XML文档
  3. ae去黑插件_视频素材如何去黑底?送你这款插件,自动一键去黑底。适用AE、PR...
  4. linux man命令_CentOS Linux中的man命令
  5. 使用 010 Editor 分析二进制文件格式
  6. iOS Hacker 动态库 dylib 注入
  7. STM32F103ZE单片机在WWDG窗口看门狗的EWI中断中喂狗导致系统复位的原因及解决办法(中断函数重入问题)
  8. Pixhawk原生固件PX4之串口添加读取传感器实现
  9. [NOTE] SQL与sqlmap
  10. 整理记录word2016小技巧,自用