在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
给去掉了
虽然没有了调试信息,但是总算是可以编译过
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
给去掉了
虽然没有了调试信息,但是总算是可以编译过
相关文章推荐
- mfc dll需要注意的地方
- 以模板的方式重载"operator <<"需要注意的地方
- C++重载内存分配时需要注意的地方
- MFC绘图需要注意的地方
- 重载及运算符重载需要注意的地方
- C++运算符重载需要注意的地方
- JAVA中 重写与重载需要注意的地方
- C++重载一些需要注意的地方
- C++运算符重载需要注意的地方
- 执行存储过程需要注意的地方
- 对于eclipse新建maven工程需要注意的地方。
- android handler发送消息需要注意的地方
- 关于Sql Server 中 Merge需要注意地方
- React中需要注意的地方(二)
- margin-top使用需要注意的地方
- JSP中使用Spring注入的Bean时需要注意的地方
- 在做到3.1数据库查询时需要注意的地方
- 做题时需要注意的地方
- 使用spring中的@Transactional注解时,可能需要注意的地方
- 使用Java中的final变量需要注意的地方。