简单内存泄露检查-- 思路整理(无代码)
2016-10-26 22:44
375 查看
前几天在网上看到了关于内存泄露的文章, 自己也总结一下, 这里只记录思路, 代码等实现过后再放出来 :)
1. 原理:
替换malloc和free等库函数, 分配内存时记录下内存的地址, 放到一个数据结构中, free时根据内存地址从数据结构中删除。 当整个程序退出时,如果数据结构中还存在表项,即认为发生内存泄露。
2.
问题1:如何记录分配内存的行号和文件?
使用__FILE__ 和 __LINE__(也可以使用__FUNCTION__), 把这些信息记录到结构体中。
问题2: 选取什么样的数据结构?
可以选用链表,树,或者hash表(我认为hash表应该是最快的,因为对于并发程序来说,需要加锁,如果hash算法选用的比较好,那么对一块内存malloc、free时只需要锁住一个冲突链,而不需要锁住整个hash桶, 树结构就不行, 而且还需要维护树。 链表就更差了, 如果表项很多, 光遍历链表就要花很长时间, 除非维护一个有序链表, 然后二分去查找,但是还是没有hash快,而且也要锁住整个链表)
问题3: 上面的原理同样可以检测内存重复释放, 如果从数据结构中查找不到对应的表项, 就可以认为是重复释放了。
3. 不足:
(1)无法检测内存越界 ---- 这个可以在自己组织的结构体左右两侧填充无效数据, 然后释放时和无效数据比较, 看无效数据是否被更改过, 如果是, 则认为写越界了。
4. 思考:
(1)对于一个比较大的系统来说, 可能会有很多模块, 可以封装一个函数, 分配内存的时候传入调用者的模块ID, 如果再细分的话, 每个模块ID后面还可以加偏移量, 这样就能准确的定位出是哪种类型的结构体内存存在泄漏了, 同时也可以再次封装, 记录行号和文件名。
1. 原理:
替换malloc和free等库函数, 分配内存时记录下内存的地址, 放到一个数据结构中, free时根据内存地址从数据结构中删除。 当整个程序退出时,如果数据结构中还存在表项,即认为发生内存泄露。
2.
问题1:如何记录分配内存的行号和文件?
使用__FILE__ 和 __LINE__(也可以使用__FUNCTION__), 把这些信息记录到结构体中。
问题2: 选取什么样的数据结构?
可以选用链表,树,或者hash表(我认为hash表应该是最快的,因为对于并发程序来说,需要加锁,如果hash算法选用的比较好,那么对一块内存malloc、free时只需要锁住一个冲突链,而不需要锁住整个hash桶, 树结构就不行, 而且还需要维护树。 链表就更差了, 如果表项很多, 光遍历链表就要花很长时间, 除非维护一个有序链表, 然后二分去查找,但是还是没有hash快,而且也要锁住整个链表)
问题3: 上面的原理同样可以检测内存重复释放, 如果从数据结构中查找不到对应的表项, 就可以认为是重复释放了。
3. 不足:
(1)无法检测内存越界 ---- 这个可以在自己组织的结构体左右两侧填充无效数据, 然后释放时和无效数据比较, 看无效数据是否被更改过, 如果是, 则认为写越界了。
4. 思考:
(1)对于一个比较大的系统来说, 可能会有很多模块, 可以封装一个函数, 分配内存的时候传入调用者的模块ID, 如果再细分的话, 每个模块ID后面还可以加偏移量, 这样就能准确的定位出是哪种类型的结构体内存存在泄漏了, 同时也可以再次封装, 记录行号和文件名。
相关文章推荐
- Valgrind 使用简单说明--检查内存泄露
- 检查c#代码内存泄露工具-CLR Profiler
- VS2010 C++最简单的检查内存泄露
- Linux下检查代码内存泄露的几种方案
- 转:检查c#代码内存泄露工具-CLR Profiler工具使用
- Linux下代码内存泄露检查工具valgrind
- VS2005检查内存泄露的简单方法
- 检查c#代码内存泄露工具-CLR Profiler
- 检查c#代码内存泄露工具-CLR Profiler工具使用
- 程序模式VS2010 C++最简单的检查内存泄露
- 检查内存泄露很好用的代码
- Linux下代码内存泄露检查工具valgrind
- C# 一个简单分词程序的思路和代码(一)
- 浅谈一个线程通信代码的内存泄露及解决方案
- VC检查内存泄露
- 防止内存泄露 Linux下用Valgrind做检查
- 浏览器中的内存泄露(重新整理ing)
- C# 一个简单分词程序的思路和代码(六) 源代码 ,测试程序,词库下载地址
- 怎样检查内存泄露的位置
- valgrind 做常态内存泄露的检查