zoukankan      html  css  js  c++  java
  • 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!
      这对于调试来说,是个巨大的福音。

  • 相关阅读:
    PHP导入导出Excel方法
    14款优秀的MySQL客户端
    php接收二进制数据流转换成图片
    PHP中curl_setopt的CURLOPT系列 选项(转)
    二十五个顶级PHP模板
    设计模式——观察者模式 Observer
    设计模式——装饰者模式
    关于JS中的constructor与prototype
    解决JQuery和其他库共存
    json 基础知识
  • 原文地址:https://www.cnblogs.com/sideny/p/3297886.html
Copyright © 2011-2022 走看看