在主程序中加入
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__) // 这一行使当检测到new分配的内存泄漏时输出文件名和行号。
#endif
以及:
int main(int argc, char *argv[])
{
QString msg("-show");
if( argc>= 2 )
{
msg = QString::fromLocal8Bit(argv[1]).trimmed();
if (msg==QString("-version"))
{
return 0;
}
}
QtSingleApplication app("db_cfg", argc, argv);
if (app.isRunning())
{
bool sentok = app.sendMessage(msg, 2000);
return 0;
}
MyMainWindow w;
w.show();
_CrtDumpMemoryLeaks(); // 此句是为了检测内存泄漏添加
return app.exec();
}
在output窗口即可观察内存泄漏情况:
Detected memory leaks!
Dumping objects ->
{203075} normal block at 0x02862100, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203074} normal block at 0x028603E0, 12 bytes long.
Data: < ! > 01 00 00 00 00 00 00 00 00 21 86 02
{203071} normal block at 0x02862098, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203070} normal block at 0x02862050, 12 bytes long.
Data: < > 01 00 00 00 00 00 00 00 98 20 86 02
{203069} normal block at 0x00B8DB98, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203068} normal block at 0x0280E4E8, 12 bytes long.
Data: < > 01 00 00 00 00 00 00 00 98 DB B8 00
{203055} normal block at 0x02861FE8, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203054} normal block at 0x02861FA0, 12 bytes long.
Data: < > 01 00 00 00 00 00 00 00 E8 1F 86 02
{203047} normal block at 0x02861F38, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203046} normal block at 0x02861EF0, 12 bytes long.
Data: < 8 > 01 00 00 00 00 00 00 00 38 1F 86 02
{203045} normal block at 0x02861E88, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203044} normal block at 0x02861E40, 12 bytes long.
Data: < > 01 00 00 00 00 00 00 00 88 1E 86 02
{203043} normal block at 0x02861DD8, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203042} normal block at 0x02861D90, 12 bytes long.
Data: < > 01 00 00 00 00 00 00 00 D8 1D 86 02
{203035} normal block at 0x0285E6D0, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203034} normal block at 0x0285EC28, 12 bytes long.
Data: < > 01 00 00 00 00 00 00 00 D0 E6 85 02
{203033} normal block at 0x02861D28, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203032} normal block at 0x02861CE0, 12 bytes long.
Data: < ( > 01 00 00 00 00 00 00 00 28 1D 86 02
{203025} normal block at 0x02861C78, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203024} normal block at 0x02861C30, 12 bytes long.
Data: < x > 01 00 00 00 00 00 00 00 78 1C 86 02
{203023} normal block at 0x02861BC8, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
{203022} normal block at 0x02861B80, 12 bytes long.
Data: < > 01 00 00 00 00 00 00 00 C8 1B 86 02
{203021} normal block at 0x02861B18, 44 bytes long.
Data: < )9g > 01 00 00 00 EC 29 39 67 00 00 00 00 00 00 00 00
被{}包围的203021就是我们需要的内存泄漏定位值,44 bytes long就是说这个地方有44 比特内存没有释放。
接下来,定位代码位置:
在main函数第一行加上:_CrtSetBreakAlloc(203021); 意思就是在申请203021这块内存的位置中断。然后调试程序,……程序中断了。查看调用堆栈(ALT+7),即可定位到具体代码。
依次类推。
===================================
===================================
发现一篇文章写得更好:
==================================
使用工具
Visual Leak Detector 2.2.3 Visual C++内存检测工具
==================================
推荐使用!(按照说明配置完毕记得重启IDE)

1060

被折叠的 条评论
为什么被折叠?



