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

前些日子在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

给去掉了

虽然没有了调试信息,但是总算是可以编译过

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值