debug

来源:互联网 发布:单片机蓝牙模块怎么用 编辑:程序博客网 时间:2024/05/21 10:47

MFC给你生成的cpp文件里面都有这么几行:


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

 

在Visual studio 中通常只用1~3行。

对于这段代码的作用,通常有一下解释:

 

        这个是为了VC检测内存泄露而定义的, 只在 Debug 版本中;

  1.         曾经一个解释说,多次使用__FILE__宏,虽然得到字符串的内容相同,但是可能地址不同,即同一个字符串常量多次用到时占用不同的地址,这样导致需要的内存增加了。为了检测内在泄露, Debug 版本的 new 附加上了调用 new 的文件名与调用所在的行号信息, 这是通过 __FILE__ 和 __LINE__ 来实现的, 这两个属于预定义的内部宏, 而之所以要用 THIS_FILE 来代替 __FILE__, 是为了减少程序大小: 如果你在一个文件中有 10000 次对 new 的调用, 那么会生成 10000 个当前文件名的常量字符串(第一个都是由 __FILE__ 宏扩展而来的), 最后生成的目标文件会很大, 而用 THIS_FILE 来代替, 当前文件名只有一份, 传递文件名使用 THIS_FILE 指针就可以了。
  2.             __FILE__和__LINE__一样都是编译器定义的宏。当碰到__FILE__时,编译器会把__FILE__替换成一个字符串,这个字符串就是当前在编译的文件的路径名。在DEBUG_NEW的定义中没有直接使用__FILE__,而是用了THIS_FILE,其目的是为了减小目标文件的大小。假设在某个cpp文件中有100处使用了new,如果直接使用__FILE__,那编译器会产生100个常量字符串,这100个字符串都是这个cpp文件的路径名,显然十分冗余。如果使用THIS_FILE,编译器只会产生一个常量字符串,那100处new的调用使用的都是指向常量字符串的指针。    
  3. 在   MFC   中,可以使用   DEBUG_NEW   宏代替  new   运算符来帮助定位内存泄漏。在程序的“Debug”版本中,DEBUG_NEW   将为所分配的每个对象跟踪文件名和行号。当编译程序的“Release”版本时,DEBUG_NEW   将解析为不包含文件名和行号信息的简单   new   操作。因此,在程序的“Release”版本中不会造成任何速度损失。  
       
      如果不想重写整个程序来使用   DEBUG_NEW   代替   new,则可以在源文件中定义下面的宏:  
       
      #define   new   DEBUG_NEW  
      当进行对象转储时,用   DEBUG_NEW   分配的每个对象均将显示被分配到的文件和行号,使您可以查明内存泄漏源。  
       
      MFC   框架的“Debug”版本自动使用   DEBUG_NEW,但代码不自动使用它。如果希望利用   DEBUG_NEW   的好处,则必须显式使用   DEBUG_NEW   或   #define   new,如上所示。  

总起来讲,这段代码的作用就是防止内存泄露,减小程序编译开销的。

另外,对于

为什么要定义THIS_FILE呢?直接使用
#define DEBUG_NEW new(__FILE__, __LINE__)

 

THIS_FILE的类型是static char[]而不是static const char[] ……

原创粉丝点击