关于VC基本有关问题?

关于VC基本问题????
在MFC程序中,
#ifdef   _DEBUG
#undef   THIS_FILE
static   char   THIS_FILE[]=__FILE__;
#define   new   DEBUG_NEW
#endif
这部分代表什么意思???
我现在使用MFC程序向导生成一个工程,然后在生成的工程里面定义自己的WinMain,然后禁止预编译头stdafx,但是每次在使用new操作符的时候就会提示错误error   C2065:   'DEBUG_NEW '   :   undeclared   identifier

请问这是为什么,希望哪位高手能详细说明,谢谢!


------解决方案--------------------
你用MFC生成的程序里是不是有CWinApp 派生的类?

这个类已经封装了WinMain函数.

在DEBUG模式下,MFC源代码中好像使用的DEBUG_NEW 来执行new操作.DEBUG_NEW比new在分配空间的时候会多分配几个字节用于调试.

你自己定义WinMain可能还是使用了MFC里面的一定源文件.所以出现这个问题..

上面的THIS_FILE应该指向当前文件名.
------解决方案--------------------
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#ifdef _DEBUG
#endif
如果定义了_DEBUG,那么编译时执行块内的内容

#undef THIS_FILE
去掉原有的对THIS_FILE的预定义

static char THIS_FILE[]=__FILE__;
__FILE__代表当前的CPP文件,将这个文件名复值给THIS_FILE

#define new DEBUG_NEW
定义new为DEBUG_NEW

这里重点说一下DEBUG_NEW,DEBUG_NEW你按F12会看到,实际上是重载了new的全局操作符,为什么要区分呢?目的是标准C++中的内存并不是托管的,是要自己手动释放的,如果不对new重载,那么使用前new了,使用后却忘了delete,这样会造成内存泄露;所以程序员就想了一个办法,重载new操作符,new的时候把内存位置记录下来,这样程序运行结束后就去校验这些分配的内存有没有被释放掉,没有释放的就提示出来;由于这个操作会额外的消耗系统资源,所以最好只是在调试的时候使用,所以就出现了你看到的这种情形,DEBUG_NEW,只有Debug模式下才声明,Release版不起作用

------解决方案--------------------
DEBUG_NEW是声明在afx.h文件[好像是]中的,而标准的stdafx.h文件中都会包含这个afx.h文件,

所以如果你禁用了预编译头,那么系统找不到这个定义,就会报错;
如果你确定不需要使用上面的方法检测内存泄露的话,那段代码也没什么用处

不过预编译头还是能够极大增加编译速度的,还是建议使用