简单内存泄露检查-- 思路整理(无代码)

来源:互联网 发布:自学数据库 编辑:程序博客网 时间:2024/05/01 10:54

前几天在网上看到了关于内存泄露的文章, 自己也总结一下, 这里只记录思路, 代码等实现过后再放出来 :)


1. 原理: 

替换malloc和free等库函数, 分配内存时记录下内存的地址, 放到一个数据结构中, free时根据内存地址从数据结构中删除。 当整个程序退出时,如果数据结构中还存在表项,即认为发生内存泄露。


2.

问题1:如何记录分配内存的行号和文件?

使用__FILE__ 和 __LINE__(也可以使用__FUNCTION__), 把这些信息记录到结构体中。


问题2: 选取什么样的数据结构?

可以选用链表,树,或者hash表(我认为hash表应该是最快的,因为对于并发程序来说,需要加锁,如果hash算法选用的比较好,那么对一块内存malloc、free时只需要锁住一个冲突链,而不需要锁住整个hash桶, 树结构就不行, 而且还需要维护树。 链表就更差了, 如果表项很多, 光遍历链表就要花很长时间, 除非维护一个有序链表, 然后二分去查找,但是还是没有hash快,而且也要锁住整个链表)


问题3: 上面的原理同样可以检测内存重复释放, 如果从数据结构中查找不到对应的表项, 就可以认为是重复释放了。



3. 不足:

(1)无法检测内存越界   ----  这个可以在自己组织的结构体左右两侧填充无效数据, 然后释放时和无效数据比较, 看无效数据是否被更改过, 如果是, 则认为写越界了。


4. 思考:

(1)对于一个比较大的系统来说, 可能会有很多模块, 可以封装一个函数, 分配内存的时候传入调用者的模块ID, 如果再细分的话, 每个模块ID后面还可以加偏移量, 这样就能准确的定位出是哪种类型的结构体内存存在泄漏了, 同时也可以再次封装, 记录行号和文件名。

0 0