您的位置:首页 > 运维架构

在MFC中重载operator new需要注意的地方

2009-01-14 10:16 513 查看
前些日子在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

给去掉了

虽然没有了调试信息,但是总算是可以编译过
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: