用_CrtSetBreakAlloc查泄漏

微软提供了在debug模式下查泄漏的方法,主要包括_CrtSetDbgFlag、_CrtDumpMemoryLeaks、_CrtSetBreakAlloc这三个函数。_CrtSetDbgFlag用于设置一些标志,具体参靠MSDN,查泄漏的话通常是

_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);

_CrtDumpMemoryLeaks放在程序最后,比如main()的最后一行,输出有关泄漏的报告。这里需要注意的是,有些内存的释放会在退出main函数体后。举个例子,比如有个类在构造函数做了内存申请,在析构函数做的释放。如果这个类的实例是静态的或者是main()的函数变量,则在_CrtDumpMemoryLeaks运行时,这部分内存尚未释放。此时则会报告有泄漏。

泄漏报告中的泄漏内存块都有编号,可以用_CrtSetBreakAlloc(编号)来定位该内存申请,程序运行时会在申请该编号内存块时中断。同样,需要考虑该内存申请的实际发生与_CrtSetBreakAlloc的顺序问题。如果_CrtSetBreakAlloc在后,则不会产生中断。所以如果涉及到某些全局或静态变量相关的内存申请的定位,需要采取一些技巧,比如下面的方法:

#pragma once

#include <crtdbg.h>

#ifdef _DEBUG

#pragma warning(disable:4074)  // initializers put in compiler reserved initialization area
#pragma init_seg(compiler)  // global objects in this file get constructed very early on

struct CrtBreakAllocSetter {
    CrtBreakAllocSetter() {
        _CrtSetBreakAlloc(151);  // 内存申请断点
    }
};

CrtBreakAllocSetter g_crtBreakAllocSetter;

#endif  //_DEBUG

以上是某个头文件里的定义。在你的main()函数的cpp文件里包含它就行了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值