DEBUG_NEW和THIS_FILE
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相关推荐
- 编译时遇到如下错误error C2061: syntax error : identifier 'THIS_FILE'
上午写程序时,加入了前些写的一个类,编译时遇到如下错误: ...error C2061: syntax error : identifier 'THIS_FILE' .../new(35) : err ...
- #ifdef _DEBUG #define new DEBUG_NEW #endif的解释
在用vc时,利用AppWizard会产生如下代码: [cpp] view plain copy print? #ifdef _DEBUG #define new DEBUG_NEW #undef TH ...
- VC里的#define new DEBUG_NEW
以下代码常常在一个类文件的开头出现,是什么意思呢? #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE ...
- C++ 文件头 static char THIS_FILE[] = __FILE__
C++ static char THIS_FILE[] = __FILE__; __FILE__ 为预编译器常量,返回当前编译的文件名,还有比较常用的几个预编译器常量, __LINE__ 编译器在编译 ...
- MFC按钮CXPButton类,代码阅读起来还是挺不错的
在操手MFC的时候,经常会抱怨MFC界面不如其他的框架或语言,比如VB,C#等等,面对MS在系统上的不断更新换代,我们也越来越追求软件的视觉效果,譬如我们会更喜欢win7下的玻璃效果,看起来很炫. 在 ...
- VC编写自己构造http协议数据的post上传图片类(MFC环境 带编码转换)(转)
上次用VC写了个MFC环境下的post数据类,地址: /Html/diannaojishu/2009-10/4905858580.html 这次将这个类进行扩展,可以post图片.但这两个post所使 ...
- VC中DDX/DDV自定义
DDX用于控件与变量的数据交换.DDV用于对数据交换后的变量进行校验,倘若校验失败将抛出异常导致Updata后面部分不能正常执行.必要时需要对Updata的返回值进行判断. 对于数据交换,需要 ...
- c语言编一个dll 用message box 弹出一个对话框,Qt学习之路(17): Qt标准对话框之QMessageBox...
2015-06-25 16:41 下面的是vc6中创建的dll程序|@||@|// TestDll2QT.cpp : Defines the initialization routines for t ...
- VC中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法总结。
C/C++ 预定义宏 例子:C/C++ 预定义宏的取值 C/C++ 预定义宏用途:诊断与调试输出 CRT 的诊断与调试输出:assert, _ASSERT/_ASSERTE, _RPTn/_RPTFn ...
最新文章
- Debian 7(Wheezy)下配置Open×××
- 计算机辅助诊断系统的应用,AI医疗影像辅助诊断系统
- 字体外面怎么加边框_字体处理的6种方法,解决ppt种字体不突出的问题
- 使用Entity Framework Core访问数据库(Oracle篇)
- vue v2.5.0源码-双向数据绑定
- mac编译安装apache+php+mysql开发环境
- python mysql批量insert数据_使用python往mysql批量插入数据时,报错not all arguments converted...
- Spring Cloud 2020 年路线图
- SocksCap代理
- 利用无线串口进行单片机通信(基于MK60)
- win10 c盘压缩卷只能压出一半?或只能压缩出一点空间的完美解决方案
- 三级等保 mysql8.0.24密码策略设置
- python科研作图系列-01热力图相关性分析
- MLflow机器学习工作流管理使用教程
- Javascript里EQ、NE、GT、LT、GE、LE含义
- Android_线程_多线程下载
- Web3 时代 传统品牌如何玩转 NFT 营销?
- 【QGIS入门实战精品教程】4.8:QGIS如何下载SRTM数字高程模型DEM?
- Excel 自动画图表
- 某985高校学者私自拷贝他人评审的基金申请书,并当自己的去申基金!国自然基金委通报!...
热门文章
- 【Linux系统编程应用】 Linux输入子系统(二)
- [Qt教程] 第27篇 XML(一)使用DOM读取XML文档
- ae去黑插件_视频素材如何去黑底?送你这款插件,自动一键去黑底。适用AE、PR...
- linux man命令_CentOS Linux中的man命令
- 使用 010 Editor 分析二进制文件格式
- iOS Hacker 动态库 dylib 注入
- STM32F103ZE单片机在WWDG窗口看门狗的EWI中断中喂狗导致系统复位的原因及解决办法(中断函数重入问题)
- Pixhawk原生固件PX4之串口添加读取传感器实现
- [NOTE] SQL与sqlmap
- 整理记录word2016小技巧,自用