转载:https://blog.csdn.net/minghui_/article/details/80748142

转自:#ifdef _DEBUG #define new DEBUG_NEW #endif的解释

在用vc时,利用AppWizard会产生如下代码:

  1. #ifdef _DEBUG
  2. #define new DEBUG_NEW
  3. #undef THIS_FILE
  4. static char THIS_FILE[] = __FILE__;
  5. #endif

对于

  1. #define new DEBUG_NEW

首先看msdn的解释:

再查看定义:

  1. #ifdef _DEBUG
  2. void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
  3. #define DEBUG_NEW new(THIS_FILE, __LINE__)
  4. #else
  5. #define DEBUG_NEW new
  6. #endif

这样就很清楚了,当在debug模式下时,我们分配内存时的new被替换成DEBUG_NEW,而这个DEBUG_NEW不仅要传入内存块的大小,还要传入源文件名和行号,这就有个好处,即当发生内存泄漏时,我们可以在调试模式下定位到该问题代码处。若删掉该句,就不能进行定位了。而在release版本下的new就是简单的new,并不会传入文件名和行号。
因此,我们在开发代码阶段,保留上述代码是值得的。

================================

补充:

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

MFC 框架的“Debug”版本自动使用 DEBUG_NEW,但代码不自动使用它。如果希望利用 DEBUG_NEW 的好处,则必须显式使用 DEBUG_NEW 或 #define new,如上所示。

情况1:

  1. #ifdef _DEBUG
  2. virtual void AssertValid() const; //assert(断言)valid(有效的,正确的)
  3. virtual void Dump(CDumpContext& dc) const; //存储上下文
  4. #endif

这两个函数是调试用的,第一个函数检查可用性,即是否有效
第二个函数如果未更改的话,最终调用的是Cwnd::Dump();
输出窗口类名,标题名等一系列信息(在输出窗口中)

  1. #ifdef _DEBUG
  2. #endif

这是条件编译,即如果有#define _DEBUG这两个函数会编译,否则忽略,
当你用debug生成时(相对于release)开发环境则自动的加上这个宏定义,这两个函数有效。

情况2:

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

如果定义了_DEBUG,表示在调试状态下编译,因此相应修改了两个符号的定义
THIS_FILE是一个char数组全局变量,字符串值为当前文件的全路径,这样在Debug版本中当程序出错时出错处理代码可用这个变量告诉你是哪个文件中的代码有问题。
定义 _DEBUG后,由于定义了_DEBUG,编译器确定这是一个调试,编译#ifdef _DEBUG和#endif之间的代码。#undef 表示清除当前定义的宏,使得THIS_FILE无定义。
__FILE__ 是编译器能识别的事先定义的ANSI C 的6个宏之一。#define new DEBUG_NEW 
DEBUG_NEW定位内存泄露并且跟踪文件名.

情况3:

  1. #ifdef _DEBUG //如果是debug状态
  2. #undef THIS_FILE //清除THIS_FILE
  3. static char THIS_FILE[]=__FILE__; //定义THIS_FILE为__FILE__(这是当前文件全路径名字)
  4. #define new DEBUG_NEW //定义new为DEBUG_NEW(这个可以检测到内 //存泄露之类的问题,其实就是可以使用crt开头的那几个调试函数)
  5. #endif

ANSI C 的6个宏:6个分别是

  1. __DATE__
  2. __FILE__
  3. __LINE__
  4. __STDC__
  5. __TIME__
  6. __TIMESTAMP__

编译C++程序时,编译器自动定义了一个预处理器名字__cplusplus(代表C++程序),自动定义名字__STDC__(代表C程序),__LINE__记录文件已经被编译的行数__FILE__包含正在被编译的文件的名字,另外两个预定义名字分别包含当前被编译文件的编译时间__TIME__ 和日期__DATE__。

#ifdef _DEBUG/ #define new DEBUG_NEW/ #endif的作用的更多相关文章

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

    转载:https://blog.csdn.net/sinat_20265495/article/details/51762738 在用vc时,利用AppWizard会产生如下代码:#ifdef _DE ...

  2. [转载] #define new DEBUG_NEW

    在用vc时,利用AppWizard会产生如下代码: #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] ...

  3. #ifdef _DEBUG

    #ifdef _DEBUG virtual void AssertValid() const; //assert(断言)valid(有效的,正确的) virtual void Dump(CDumpCo ...

  4. #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #endif

    情况1:#ifdef _DEBUGvirtual void AssertValid() const;                 //assert(断言)valid(有效的,正确的)virtual ...

  5. ifndef/define/endif 的作用

    转载自百度百科 ,感谢度娘 1 2 3 #ifdef语句1 //程序2 #endif 可翻译为:如果宏定义了语句1则执行程序2. 作用:我们可以用它区隔一些与特定头文件.程序库和其他文件版本有关的代码 ...

  6. 关于语句#ifdef OS_GLOBALS #define OS_EXT #else #define OS_EXT extern #endif 的说明

    声明全局变量使用的技术——摘自uC/OS-II中文版 以下是如何定义全局 变量.众所周知,全局变量应该是得到内存分配且可以被其他模块通过C 语言中extern 关键字调用的变量.因此,必须在 .C 和 ...

  7. 头文件里面的ifndef /define/endif的作用

    c,c++里面,头文件里面的ifndef /define/endif的作用 今天和宿舍同学讨论一个小程序,发现有点地方不大懂······ 是关于头文件里面的一些地方: 例如:要编写头文件test.h ...

  8. 【转】#ifdef _DEBUG用法小结

    原文地址:http://blog.csdn.net/shijizhisheng/article/details/1908054 1 #ifdef _DEBUG virtual void AssertV ...

  9. “#if 0/#if 1 ... #endif”的作用

    1. "#if 0/#if 1 ... #endif"的作用,我们知道,C标准不提供C++里的"//"这样的单行风格注释而只提供"/* */" ...

随机推荐

  1. .Net Task 异步执行不等待结果返回

    该文章适合有一定异步编程基础的童鞋 开始之前先看.NET官网的一张图: 异步编程中最需弄清的是控制流是如何从方法移动到方法的. 没有理解的话可以去看一下 https://docs.microsoft. ...

  2. 用Java写编译器(1)- 词法和语法分析

    词法和语法分析器构建 ANTLR简介 ANTLR全称ANother Tool for Languate Recognition,是基于LL(*)算法实现的语法分析器生成器和词法分析器生成器,由旧金山大 ...

  3. Anchors Piovt详解

    这个两个东西是RectTransform里面的两个属性,也是UGUI做UI自适应的重要工具,之前做的的时候,都只是调出效果即可,并没有深究其中的原理,现在决定来补上这个漏洞. 首选我们来看看Ancho ...

  4. Activiti7 获取资源信息及其查询流程历史信息

    获取资源信息 /** * 获取资源信息 * * @throws IOException */ @Test public void getProcessResources() throws IOExce ...

  5. Java中构建长字符串的四种模式

    回字有四种写法,构建字符串也有四种方式. 用+号最快,第二第三种可读性好,第四种是log4j自有的.下面请见代码: package logbackCfg; import java.text.Messa ...

  6. HTML5总结整理

    (仅供大家学习分享交流) 一.简介 1.前端开发最核心技术 我们知道,用所谓的网页三剑客已经不能满足需求了,那前端开发究竟要学习什么技术呢?网页最 主要由3部分组成:结构.表现和行为.网页现在新的标准 ...

  7. 面向对象--有参数的__init__方法

    有参数的__init__()方法 class Hero(object): """定义了一个英雄类,可以移动和攻击""" def __init ...

  8. loadrunner跑场景时报错Full MDB file. New error messages will be ignored

    这个原因是在controller跑场景时,controller的日志文件占用内存太大 解决办法:先找到controller的日志文件Results——Results Setting——找到日志的路径, ...

  9. 【二叉树-BFS系列1】二叉树的右视图、二叉树的锯齿形层次遍历

    题目 199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, ...

  10. 关于AES的S盒子的计算

    对于置换piS 有如下计算: The matrix used in AES is a rotational matrix based on the value 0x1F, which is 00011 ...