C++。memory leak检查办法。一个当内存分配后未回收(或导致各种问题)的检查办法
2014-05-13 17:02
134 查看
内存未回收是指
比如c的情况是malloc之后没有free
C++则是太多的new
检查办法
引入crtdbg.h
#include crtdbg.h
程序开始时调用函数_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | CRTDBG_LEAK_CHECK_DF)
开关解释:
CRTDBG_ALLOC_MEM_DF
ON : 打开debug用的内存分配记录
_CRTDBG_LEAK_CHECK_DF
程序结束时候,调用_CrtDumpMemoryLeaks 检查内存是否有多分配的地方
...
当log有如下信息,则是指【18】号分配的内存未被释放
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
...
此时使用debug,找变量_crtBreakAlloc在第一个
_crtBreakAllocs地方设置断点,程序运行到这更改_crtBreakAlloc的值为18,(参考log信息)
再F5运行,只到会产生memory leak的地方就会报错,选择中断,并查询调用履历,
找到之前malloc,DBG_NEW或者new的地方就是未释放内存被分配到的地方。
增加释放内存的代码,再重新尝试只到问题解决。
比如c的情况是malloc之后没有free
C++则是太多的new
检查办法
引入crtdbg.h
#include crtdbg.h
程序开始时调用函数_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | CRTDBG_LEAK_CHECK_DF)
开关解释:
CRTDBG_ALLOC_MEM_DF
ON : 打开debug用的内存分配记录
_CRTDBG_LEAK_CHECK_DF
程序结束时候,调用_CrtDumpMemoryLeaks 检查内存是否有多分配的地方
...
当log有如下信息,则是指【18】号分配的内存未被释放
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
...
此时使用debug,找变量_crtBreakAlloc在第一个
_crtBreakAllocs地方设置断点,程序运行到这更改_crtBreakAlloc的值为18,(参考log信息)
再F5运行,只到会产生memory leak的地方就会报错,选择中断,并查询调用履历,
找到之前malloc,DBG_NEW或者new的地方就是未释放内存被分配到的地方。
增加释放内存的代码,再重新尝试只到问题解决。
相关文章推荐
- C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
- C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?
- C++程序变量在内存中的分配问题
- 一个很有深度的C++内存问题---GDB调试(一)
- 不显示删除回复显示所有回复显示星级回复显示得分回复 [推荐] [百度分享]频繁分配释放内存导致的性能问题的分析
- C/C++内存问题检查利器—Purify (五)
- [百度分享]频繁分配释放内存导致的性能问题的分析
- maven项目由于多个依赖中含有同一个jar包导致的冲突问题的解决办法
- 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点
- C++内存分配问题若干_1
- memset导致的内存泄露问题的解决办法
- C++中内存分配的问题
- [转] C++程序内存分配的问题
- C/C++内存问题检查利器——Purify
- C/C++内存问题检查利器—Purify (四)
- 推荐一个C++内存泄露检查工具
- C/C++内存问题检查利器——Purify
- 频繁分配释放内存导致的性能问题的分析
- C++内存对象分配问题
- C/C++内存分配问题