C++ 内存泄露 截获 宏相关

lonelyrains 软件工程师  2011-07-05 09:03:10


#include <crtdbg.h>

#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new(_CLIENT_BLOCK,__FILE__,__LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif

//#define _CRTDBG_MAP_ALLOC

#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif

//直接#define new new(_CLIENT_BLOCK,__FILE__,__LINE__)报错
void _EnCheckMemoryLeaks()
{
int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag( tmpFlag );
//改成_CrtSetDbgFlag( _CRTDBG_REPORT_FLAG|_CRTDBG_LEAK_CHECK_DF );不能打印内存泄露
}

int main(int argc,char* argv[])
{
_EnCheckMemoryLeaks();
int *p=new int();
//_CrtDumpMemoryLeaks();
delete p;
return 0;
}



参考http://blog.csdn.net/phinecos/article/details/4745720的文章,写的代码。对其中的宏定义很不理解。为什么

#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new(_CLIENT_BLOCK,__FILE__,__LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif

//#define _CRTDBG_MAP_ALLOC

#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif

定义为

#ifdef _DEBUG
#define new new(_CLIENT_BLOCK,__FILE__,__LINE__)
#endif

或者

#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new(_CLIENT_BLOCK,__FILE__,__LINE__)
#define new DEBUG_CLIENTBLOCK
#endif

都会报错呢?C++不是有防止宏递归的机制吗?而且为什么分成两部分就不报错了呢?
...全文
78 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wulala456 2011-07-05
第一次运行有错误,再运行一次就没错了.
回复
wulala456 2011-07-05
http://wanliqunn.blog.163.com/blog/static/9865179200811195386572/

另:VS2005上你举的三个都没有报错,都很正常.

#include "stdafx.h"
#include <crtdbg.h>

//#ifdef _DEBUG
//#define DEBUG_CLIENTBLOCK new(_CLIENT_BLOCK,__FILE__,__LINE__)
//#define new DEBUG_CLIENTBLOCK
//#endif



//#ifdef _DEBUG
//#define new new(_CLIENT_BLOCK,__FILE__,__LINE__)
//#endif
//



//#ifdef _DEBUG
//#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
//#else
//#define DEBUG_CLIENTBLOCK
//#endif
//#define _CRTDBG_MAP_ALLOC
//
//#ifdef _DEBUG
//#define New DEBUG_CLIENTBLOCK
//#endif

int _tmain(int argc, _TCHAR* argv[])
{
int* p = new int();
_CrtDumpMemoryLeaks();
return 0;
}


回复
taodm 2011-07-05
换一个编译器再试。
回复
lonelyrains 2011-07-05
1楼是个mm?访问量貌似还挺高
[Quote=引用 1 楼 tan625747 的回复:]
不清楚,等明天上班,有高人来解答吧
[/Quote]
回复
lonelyrains 2011-07-05

#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new(_CLIENT_BLOCK,__FILE__,__LINE__)
#define DEBUG_CLIENTBLOCK1 DEBUG_CLIENTBLOCK
#define new DEBUG_CLIENTBLOCK1
#endif


就行了,貌似还是那个宏没有完全展开的原因。这个真有点头大,没法调试,所以很难找引起错误的关键位置在哪
回复
tan625747 2011-07-05
不清楚,等明天上班,有高人来解答吧
回复
相关推荐
发帖
智能路由器
创建于2018-06-15

636

社区成员

智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
申请成为版主
帖子事件
创建了帖子
2011-07-05 09:03
社区公告
暂无公告