VS2008 内存泄漏

在主程序中加入

#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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值