简单的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代替。

实际上我对内存的分配释放进行了封装,每次需要时调相应的函数或宏即可。


0 0
原创粉丝点击