首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

"#define new DEBUG_NEW"和"#undef THIS_FILE"等实际上是否必要?

在C++编程中,#define是一个预处理指令,用于定义宏。#undef则用于取消已定义的宏。在这个问答中,我们将讨论#define new DEBUG_NEW#undef THIS_FILE的作用和必要性。

  1. #define new DEBUG_NEW

这个宏定义用于在调试和诊断内存泄漏时,替换C++的new操作符。DEBUG_NEW是一个在MFC(Microsoft Foundation Classes)库中定义的宏,用于在调试模式下跟踪内存分配。当你在开发过程中使用这个宏定义,所有的new操作符都将被替换为DEBUG_NEW,从而启用内存诊断功能。这在发现内存泄漏问题时非常有用。

是否必要:这个宏定义的使用取决于你的开发需求。如果你在开发过程中需要诊断内存泄漏问题,那么使用这个宏定义是非常有益的。否则,它并不是必需的。

  1. #undef THIS_FILE

这个宏定义用于取消已定义的THIS_FILE宏。THIS_FILE通常用于在宏定义中表示当前文件的名称。#undef指令用于取消已定义的宏,从而避免在后续代码中引起歧义或冲突。

是否必要:取消已定义的宏取决于它在代码中的作用和使用场景。如果在你的代码中THIS_FILE宏定义不再需要,或者它导致了冲突或问题,那么取消它是有益的。否则,它并不是必需的。

总结:#define new DEBUG_NEW#undef THIS_FILE都是C++预处理指令的应用,它们分别用于定义和取消已定义的宏。它们的必要性取决于你的开发需求和具体场景。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • (转载)VC的内存泄漏检查

    2.1 对于C++分配的内存 MFC是通过下面的语句支持的: #ifdef _DEBUG #define new DEBUG_NEW #endif 我们简单分析一下: 在MFC中,DEBUG_NEW...也是个宏,定义为: #define DEBUG_NEW new(THIS_FILE, __LINE__) 所以,在MFC debug下,调用new操作符,会使用 void* __cdecl operator...三、总结(这部分要全部看完再编写代码): 我们验证VC是否启动用了详细内存泄漏信息检测的方法,一个是运行一次程序,看报告是否包含文件名行号;另一种方法是单步调试new或malloc调用,如果能进入带文件名行号参数的函数...之所以#define new DEBUG_NEW不放到stdafx.h文件中,是因为:定义的new,可能gdiplus不兼容,因为gdiplus里,也重载了operator new,如果放到stdafx.h...用VS的查找功能,看是否仍然有漏网之鱼。如果有,手工删除。 4. 用EMEditor的DumpMemoryLeaks.jsee宏,为剩余的CPP文件,插入#define new宏。

    1.4K20

    VC的内存泄漏检查

    2.1 对于C++分配的内存 MFC是通过下面的语句支持的: #ifdef _DEBUG #define new DEBUG_NEW #endif 我们简单分析一下: 在MFC中,DEBUG_NEW...也是个宏,定义为: #define DEBUG_NEW new(THIS_FILE, __LINE__) 所以,在MFC debug下,调用new操作符,会使用 void* __cdecl operator...三、总结(这部分要全部看完再编写代码): 我们验证VC是否启动用了详细内存泄漏信息检测的方法,一个是运行一次程序,看报告是否包含文件名行号;另一种方法是单步调试new或malloc调用,如果能进入带文件名行号参数的函数...之所以#define new DEBUG_NEW不放到stdafx.h文件中,是因为:定义的new,可能gdiplus不兼容,因为gdiplus里,也重载了operator new,如果放到stdafx.h...用VS的查找功能,看是否仍然有漏网之鱼。如果有,手工删除。 4. 用EMEditor的DumpMemoryLeaks.jsee宏,为剩余的CPP文件,插入#define new宏。

    1.8K40

    【大三操作系统实验】 请求页式管理中的置换算法

    参考链接: Python中的置换组合 (1)FIFO算法总是选择在内存驻留时间最长的一页将其淘汰。FIFO算法认为调入内存的页不再被可能性要比其他页大,因而选择最先调入内存的页换出。 ...     //       #include "stdafx.h"    #include "置换算法.h"    #include "置换算法Dlg.h"       #ifdef _DEBUG    #define...new DEBUG_NEW    #undef THIS_FILE    static char THIS_FILE[] = __FILE__;    #endif       /    // CAboutDlg...point);    }          void CMyDlg::Onqueding()     {        UpdateData();        CListCtrl *m_list = new...int[m_mem];   //内存分配数组            memset(mem,-1,sizeof(int)*m_mem);  //初始化为-1            count = new

    54130

    MFC进度条同步问题

    移动进度条到状态条的第一个窗口; }   从上述代码可以看出,CProgStatusBar::OnSize()将进度指示器放在了状态栏的第一个窗格,这个窗格通常用来显示程序的”就绪”信息命令提示信息...在隐藏/显示进度控制时尤其如此,这时候会出现两个问题:第一,因为进度指示器显示在状态栏的第一个窗格位置,所以如果进度条指示器显示时已经显示有状态信息,那么进度指示器状态信息文本就会有冲突,相互干扰。...编程步骤   1、 启动Visual C++6.0,生成一个单文档应用程序prgsbar,项目的视图类的基类选择CEdit类;   2、 在程序的Resource.h文件中添加自定义消息的定义: #define...CProgStatusBar) }; / CprogStatusBar类的实现文件; #i nclude “StdAfx.h” #i nclude “ProgBar.h” #ifdef _DEBUG #define...new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNAMIC(

    1.1K10

    malloc函数实现过程

    在C语言中,要进行动态内存的开辟就需要使用到malloc函数,在C++中使用的new关键字的基层也是调用了malloc函数,可见malloc函数的重要性,这个就浅析一下malloc的实现过程。...sizeof(type*n)); // type表示数据类型; // n表示需要创建几个该类型的成员 // sizeof(type*n)表示成员所占空间 有函数原型可知 malloc函数返回值是void*,所以实际上是用的时候都将其进行了强制转换...表示它是无符号整数类型 sizeof关键返回值是size_t,所以不会冲突 重点内容 malloc函数申请空间的操作步骤: 对堆进行加锁 在正式申请空间之前,对堆进行校验 检测申请内存块的类型 检测内存空间是否充足...,不够设置错误信息,返回NULL,否则进行5 检测块的类型 计算本次所要申请的内存块的总字节数 按照计算的总字节数申请内存,底层真正向堆申请空间的是HeapAlloc函数 检测是否申请成功,如果申请失败设置错误信息...,返回NULL,否则执行9 修改请求次数目前申请的总字节数 将新申请的内存块的新节点头插到双向链表中 给该结点对应的结构体赋值 填充空间 获取申请内存块中存放有效数据的真正位置 对堆进行解锁 返回有效数据区域的地址

    1.1K20

    【为宏正名】本应写入教科书的“世界设定”

    说“宏不属于C语言”是一种夸张的说法,但却非常反映问题的本质基本事实: C语言的编译分为三个阶段:预编译阶段、编译阶段链接阶段。...;又比如在switch中是否所有的枚举条目都有对应的case(在省缺default的情况下)。...【宏是引用而非变量】 ---- 具体实践中,很多人在使用宏过程中会产生“宏是一种变量”的错觉,这是因为无论一个宏此前是否定义过,我们都可以借助 #undef 操作,强制注销它,从而有能力重新给这一宏赋予一个新的值...,例如: #include #undef false #undef true #define false 0 #define true (!...2 # undef DEBUG_USART # define DEBUG_USART 2 # elif DEBUG_USART == 3 # undef

    76740

    C++|内存管理|new cookie实验

    #ifdef _DEBUG #ifndef _CRTDBG_MAP_ALLOC #undef _malloca #define _malloca(size)...在多次探索char数组的内存而不得后,我通过遍历的方式撞击前后1kb的内存,看是否有魔术数字正好能对应内存大小,尽管内存中因为随机性有这样的数字,但是位置的规律性根本看不出。...正式实验 在继续查阅了其他资料之后,我得知了new的机制malloc存在差异,例如malloc/free本身只需要宣告内存被占用/释放即可,而new/delete却要完成对应的构造/析构操作,如果仅仅存储字节大小...实验结论 对于栈中的自动对象,int a[5],直接由编译器提供大小,作为一种立即数直接参与汇编码中,这也是为什么栈数组必须使用常数的缘故,因为作为代码的一部分这必须是编译期间已知的。...对于堆上的内置类型或POD结构体(int,char等等),不存储大小,因为编译器根本无需析构,也没有必要知道数组具体的大小。内存的释放由malloc/free存储的字节大小处理即可。

    59130

    基于visual c++之windows核心编程代码分析(8)自动下载更新程序

    Windows程序,经常需要自动更新,该功能如何实现呢,我们来看代码实现与注释讲解 #include "stdafx.h" #include "AutoUpdate.h" #ifdef _DEBUG #define...new DEBUG_NEW #endif // 唯一的应用程序对象 CWinApp theApp; using namespace std; #define MYVERSION                       ...DWORD WINAPI UpdateThreadProc(LPVOID lParam) {     /*     *如果有必要,可以使用GetTempPath() 函数获取系统临时文件目录,将用到的文件下载至该目录...*/     wchar_t *TempFileName= new wchar_t[255];    //升级文件临时文件名,在该程序中为“AutoUpdate_.exe”     wmemset(...if(UpdateVersion>MYVERSION)    //判断现有版本是否大于程序自身版本     {         //MessageBox(NULL,_T("发现新版"),_T("在线更新

    56420

    PHP7内核(七):常见变量类型的基本结构

    #define IS_UNDEF 0 /* 标记未使用类型 */ #define IS_NULL 1 /* NULL */ #define IS_FALSE 2 /* 布尔类型false...14 /* 内部类型 */ #define IS_INDIRECT 15 /* 间接类型 */ #define IS_PTR 17 /* 指针类型 */ IS_UNDEF:标记未定义.../* function类型 */ struct { uint32_t w1; uint32_t w2; } ww; } zend_value; 基本可以看出该结构体的变量上文定义的类型是一一对应的...val:字符串的内容,val[1]并不表示只能存储1个字节,在字符串分配时实际上是操作了malloc(sizeof(zend_string)+字符串你长度),也就是会多分配一些内存,而多出来的内存起始位置就是...u:这里的u主要还是起到辅助作用,比如flags用来设置散列表的一些属性是否持久化、是否已经初始化

    71620

    【为宏正名】99%的人从第一天学习C语言就自废的武功

    对于这个头文件的用途原理感到好奇的小伙伴,不妨单击这里,重新阅读一下这篇文章。...【可重复头文件的固定结构】 ---- 可重入头文件的基本结构一般固定为5个分区,如下图所示: 文档区:主要用于放置头文件使用说明,当然,也包括可选的License版本信息; 输入参数检查区:对作为输入参数的宏进行必要的检测...:实现具体功能的区域,一般会包含如下的内容: 定义一些宏、带参数的宏等等 进行条件编译 包含其它头文件,或者进行递归包含 垃圾清理区:主要用于清理头文件所产生的宏垃圾,其中包括: 【可选】根据情况决定是否...第四步:清理垃圾(更新垃圾清理区) 在这个例子中,由于我们是通过递归返回的方法来实现功能,因此不能在尾部 #undef 关键的两个参数 MFUNC_IN_START MFUNC_IN_DELTA,但我们却可以清理输入参数...[4] = { #undef MFUNC_IN_START #undef MFUNC_IN_DELTA #define MFUNC_IN_START 0 #define MFUNC_IN_COUNT

    69031

    ESLint配置信息完整版

    ##ESLint配置信息完整版 #####说明: "no-undef": 0,"no-undef": 'off',一样,表示关闭该功能 "no-undef": 1, 表示仅提示 "no-undef"...禁止无用的表达式 “no-unused-vars”: [2, {“vars”: “all”, “args”: “after-used”}],//不能有声明后未被使用的变量或参数 “no-use-before-define...”: 2,//未定义前不能使用 “no-useless-call”: 2,//禁止不必要的callapply “no-void”: 2,//禁用void操作符 “no-var”: 0,//禁用var,...”: 2,//函数名首行大写必须使用new方式调用,首行小写必须用不带new方式调用 “new-parens”: 2,//new时必须加小括号 “newline-after-var”: 2,//变量声明后是否需要空一行...“object-curly-spacing”: [0, “never”],//大括号内是否允许不必要的空格 “object-shorthand”: 0,//强制对象字面量缩写语法 “one-var”:

    2.3K10

    【C语言】宏定义

    预定义标识符有define、printf、scanf 它们是可以作为标识符的。 字符可以是常数、表达式 以及 格式字符串符。...实际上我们想要得到4*4的一个结果实际上这也很容易,把字符串文本修改下即可。 #define S(x) (x)*(x)         当然这还是不够严谨,完美再加一个小括号再外面。...选出上述代码正确的值不能 一共四个选项如下↓ A:40 B:22 C:88 D:10         可能有些人会选择A这个选项,因为 10 * 2 = 20 然后,20+20 = 40,但实际上这是错误的上面所犯的错误都是一模一样的...#undef #undef 是为取消定义,用于移除一个宏的定义。 格式形式如下 #undef NAME 如果现在的一共名字需要被重新定义的话,那么旧名字就会被移除。...如下代码所示 #define _CRT_SECURE_NO_WARNINGS 1 #include #define NUM 10 int main(void) { #undef NUM

    32510
    领券