前些日子在vs2005中新建了一个MFC工程,添加了一个类,并重载了该类的new操作符,整个类看起来就是下面这个样子:
class Test
{
public:
Test(){};
virtual ~Test(){}
void* operator new (size_t sz)
{
TRACE("/n operator new /n");
return malloc(sz);
}
};
然后做了如下的调用
Test *p = new Test();
结果在编译Debug版的时候,vs2005给出了一个非常奇怪的错误:
error C2660: 'Test::operator new' : function does not take 3 arguments
如果改为Release版,却又能通过编译,真是见鬼了!
经过查找资料才弄清楚了,原来这是MFC搞得鬼--在Debug版预编译的时候,MFC悄悄地将你的new操作符调用作了如下的变换
Test *p = new (__FILE__,__LINE__) Test();
多出来的参数大家都能猜出他们的意思----没错,这也是为什么我们忘记对new 出来的内存调用delete时,编译器能给出如下信息的原因:
Detected memory leaks!
Dumping objects ->
d:/test/blognewtest/blognewtest/blognewtestdlg.cpp(99) : {131} normal block at 0x003ACFE8, 4 bytes long.
Data: <, A > 2C CE 41 00
Object dump complete.
如果你需要在Debug版下调用重载的new操作符,请作如下定义:
void* operator new (size_t sz,LPCSTR lpszFileName, int nLineNum )
{
TRACE("/n operator new /n");
return malloc(sz);
}
在实际中因为是跨模块应用,没办法控制他人的new编写,所以最后把MFC中本模块的
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
给去掉了
虽然没有了调试信息,但是总算是可以编译过