实验内存泄露的检测
来源:互联网 发布:mac版谷歌dhc插件下载 编辑:程序博客网 时间:2024/05/20 12:25
[ 转载请注明来自CoderJeff的CSDN博客:http://blog.csdn.net/coderjeff/article/details/46474689,谢谢!]
参考文章:浅谈C++中内存泄露的检测
实验心得:
1. 除了最后使用Exit函数的方法外,前面的方法都需要在调试状态下,即,只按F5,才能检测出泄露的位置,否则,如果Ctrl+F5,output中无法显示相应信息。理论上来讲,Ctrl+F5也符合_DEBUG的定义,但不知为什么总是失败。待查。
2. 在1的情况下,下面两种写法都行。
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
或
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
3. 最后使用Exit函数的方法,并不能指示出泄露的位置,只能提示assert(i==0)的位置,也就是说,无论泄露的地方有多少,只会指示Exit函数内部一个地方。比如下面的代码:
#include "stdafx.h"
#include <new>
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <assert.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
void Exit()
{
int i = _CrtDumpMemoryLeaks();
assert(i == 0);
}
void func()
{
int *p = new int; //泄露位置1
}
int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
//_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//atexit(Exit);
int *p = new int[4]; //泄露位置2
func();
return 0;
}
采用1和2中的方法,可以准确指示出”泄露位置1“和”泄露位置2“,但如果用atexit(Exit),只会指示assert(i==0)的位置。
实验环境:VS2013 (符合C++11的编译器)
- 实验内存泄露的检测
- 内存泄露的检测
- 内存泄露的检测
- 检测内存泄露的方法:
- C++ 内存泄露的检测
- C++ 内存泄露的检测
- 内存泄露的检测方法
- 检测内存泄露的工具
- 检测内存泄露的方法
- 检测内存泄露的原理
- C++内存泄露的检测
- OpenCV内存泄露的检测
- 检测内存泄露的原因
- 检测内存泄露的常用手段:debugnew
- 一条检测内存泄露的函数
- 一条检测内存泄露的函数.
- 使用valgrind检测内存泄露的问题。
- 检测内存泄露的工具:debugnew
- Jmeter做性能测试——HTTP请求
- django 学习笔记
- android-studio undefined reference to `__android_log_print
- struts2注解@Result的几个跳转方式说明
- hdu1233
- 实验内存泄露的检测
- LruDiskCache
- 反射
- FaceBooK/infer-Mac下安装Java分析环境
- 【数据结构】跳跃列表 SkipList
- 时间格式化函数strftime
- Codeforces #186(div 2)D. Ilya and Roads
- LCD12864液晶使用-ST7920
- NIO系列6:流行 NIO Framework netty 和 mina 性能测评与分析