求助:在Qt下,打开宏_CRTDBG_MAP_ALLOC,工程无法编译

狂奔中的毛豆 2010-11-25 11:14:16
在工程中,一边添加功能,一边做单元测试和内存泄漏的检测。我没有用另外的内存检测工具来检测,而是用VC自带的内存检测方法。

在头文件中定义宏 _CRTDBG_MAP_ALLOC,并包含了stdlib.h, crtdbg.h之后,在某些地方通过调用_CrtDumpMemoryLeaks()来检测内存泄漏状况。

但是非常不走运的是,一旦自己定义了 _CRTDBG_MAP_ALLOC之后,整个程序就编译不通过了。如果不定义这个宏,虽然能够看到检测结果,但却无法定位其泄漏的位置。这个令我很苦恼。

同时,查看crtdbg.h文件,发现,一旦定义了这个_CRTDBG_MAP_ALLOC,就会重新定义一些内存分配的函数入口的宏定义,比如
 /****************************************************************************
*
* Heap routines
*
***************************************************************************/

#ifdef _CRTDBG_MAP_ALLOC

#define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define calloc(c, s) _calloc_dbg(c, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define realloc(p, s) _realloc_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define _recalloc(p, c, s) _recalloc_dbg(p, c, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define _expand(p, s) _expand_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
#define free(p) _free_dbg(p, _NORMAL_BLOCK)
#define _msize(p) _msize_dbg(p, _NORMAL_BLOCK)
#define _aligned_msize(p, a, o) _aligned_msize_dbg(p, a, o)
#define _aligned_malloc(s, a) _aligned_malloc_dbg(s, a, __FILE__, __LINE__)
#define _aligned_realloc(p, s, a) _aligned_realloc_dbg(p, s, a, __FILE__, __LINE__)
#define _aligned_recalloc(p, c, s, a) _aligned_recalloc_dbg(p, c, s, a, __FILE__, __LINE__)

然而在Qt的一些底层实现中,同样也定义了一些函数,且命名与此上述宏定义中的某些函数相同,只是参数不同。比如qbytearray.h文件中,某个类定义了函数
void realloc(int alloc);


对于这样的问题,我该如何解决呢?能否有一个开销最小的解决方案。最好不要用第三方工具来检测。

谢谢各位兄弟帮忙。谢谢。
...全文
243 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
狂奔中的毛豆 2010-11-26
  • 打赏
  • 举报
回复
@dizuo:
谢谢兄弟的提示,我尝试了你提供的方法,但是没有效果,问题依旧。

最后我在其他地方找到了一些提示。

http://www.qtcentre.org/threads/11431-Qt4-amp-Visual-Studio-memory-leak-detection

在这个地址中,我似乎看到了问题所在。由于Qt的内存管理中有自己的内存函数重载(不知道是否可以这么说),因此,如果打开了vc自己的内存泄漏检测代码,将导致两方面的冲突。特别是有可能会使得Qt的那部分重新定义的函数,或者命名相同的函数出现了冲突。主要的冲突主要是参数个数上的不同。

随着问题的进一步深入,我发现自己掉进了头文件陷阱。现在已经是深夜了,总算把各个源文件中的头文件调整完毕。打开vc内存检测代码的宏定义,没有问题。编译都通过了。谢谢兄弟对这个问题的提示,万分感谢。

好了,我准备结贴了。分数就给唯一的答案提供者dizuo
ryfdizuo 2010-11-25
  • 打赏
  • 举报
回复
Qt工程中,我用的这个文件是没有问题。
setdebugnew.h
#ifndef SET_DEBUG_NEW_H
#define SET_DEBUG_NEW_H

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

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif

#endif
狂奔中的毛豆 2010-11-25
  • 打赏
  • 举报
回复
这个问题竟然也没有兄弟懂。冒汗啊

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧