简单的C/C++内存泄漏及检测
来源:互联网 发布:电脑编程多久能学会 编辑:程序博客网 时间:2024/06/05 20:23
C/C++内存泄漏及检测
作者:吴秦
出处:http://www.cnblogs.com/skynet/
源文链接:http://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html
扩充:dll中的内存泄漏检测
以下内容为工作经验,没有去查找具体的理论支持,仅供参考。
如果对外输出的是dll,内存检测与上述文档中描述的存在少许差异,例如多人合作的项目,我们有时可能不能要求调用dll的人去为我们添加 _CrtDumpMemoryLeaks()或者_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );这时就要我们在内部处理,以下是我的做法。
1.为dll添加一个一个出口函数
可能这个函数并没有什么具体的功能,仅仅是调用了_CrtDumpMemoryLeaks()。我们可以要求调用dll在使用完dll后调用我们的出口函数,理由可以有很多,例如资源释放什么的。
为什么不是添加入口函数?
经过实际测试,如果在入口函数中添加_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ),并没有达到检测内存泄漏的效果,原因未知,有时间再去研究。
2.关于new重载的问题
如原文所说,我们可以重载new,然后实用之,但是在实际中可能会比较麻烦,尤其是当使用了stl或其他第三方库或源码时。因为可能别人已经进行了重载,会引起编译问题。有人提供的方案是在每次使用时将stl等的头文件放在重载之前,感觉比较麻烦。所以我的做法是这样的:
使用#define定义“new”
/************************************************************************//* 内存泄漏检测支持。 *//************************************************************************/#ifdef _DEBUG // 内存泄漏检测支持。#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <malloc.h> // 解决 malloc.h 与 crtdbg.h 顺序导致的 Debug Assertion Failed, "Corrupted pointer passed to _freea" 。#include <crtdbg.h>#ifndef MCIM_DBG_NEW#define MCIM_DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )#endif#else#ifndef MCIM_DBG_NEW#define MCIM_DBG_NEW new#endif#endif // _DEBUG然后在该使用new的地方使用MCIM_DBG_NEW代替。
实际上我对内存的分配释放进行了封装,每次需要时调相应的函数或宏即可。
- 简单的C/C++内存泄漏及检测
- C/C++内存泄漏简单检测机制
- 一个简单的内存泄漏检测C工具
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++ - 内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- C/C++内存泄漏及检测
- 密码提取-排序
- kinect1+depthimage_to_laserscan
- 项目实战-对象序列化
- leetcode Binary Tree Maximum Path Sum
- jsp实现文件下载
- 简单的C/C++内存泄漏及检测
- Dialog工具类
- Maven settings.xml的作用
- VS 2013 产品密钥
- Java进阶之路_重温《java编程思想》篇(二)
- AndroidStudio中build.gradle基本属性的简介
- UTF-8 Validation
- Chrome 控制台console的用法
- 视差cubmap(cubmap的进阶应用)