天天看点

Valgrind参数配置详解

Valgrind相关理解

内存泄漏的定义

申请了空间,却没有释放, 但是有些时候,这个并不被程序员认为内存泄漏,比如,在进程初始化时,申请一个全局的变量用来记录某个函数被调用的次数,因为谁也不知道这个函数什么时候调用,所以只要进程存在,它就不能释放,当进程结束时,该内存会被系统回收,故对程序员来说,没有释放的必要,这种Valgrind称为still reachable;

其实,真正的内存泄漏,应该那些申请了空间,但是,在进程结束时,却发现没有指向它的指针,那么这种一定是内存泄漏,这种Valgrind称为definitely lost;

输出结果释义

definitely lost:确认丢失。这就是真正的内存泄漏,最为严重,程序中存在内存泄露,必须尽快修复。当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存则会报这个错误。

“indirectly lost”:间接丢失。当使用了含有指针成员的类或结构时可能会报这个错误。这类错误无需直接修复,他们总是与”definitely lost”一起出现,只要修复”definitely lost”即可。

“possibly lost”:可能丢失。大多数情况下应视为与”definitely lost”一样需要尽快修复,除非你的程序让一个指针指向一块动态分配的内存(但不是这块内存起始地址),然后通过运算得到这块内存起始地址,当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存的起始地址,但可以访问其中的某一部分数据,则会报这个错误。

“still reachable”:可以访问,未丢失但也未释放。如果程序是正常结束的,那么它可能不会造成程序崩溃,但长时间运行有可能耗尽系统资源。如果程序是崩溃(如访问非法的地址而崩溃)而非正常结束的,则应当暂时忽略它,先修复导致程序崩溃的错误,然后重新检测。

“suppressed”:已被解决。出现了内存泄露但系统自动处理了。

tool 主要参数包括

- Memcheck(默认参数), 内存泄漏检查工具

–leak-check=full 指的是完全检查内存泄漏

–show-reachable=yes 是显示内存泄漏的地点

形如:–tool=Memcheck(默认可以不写)

常用命令格式
valgrind --tool=memcheck --leak-check=full ./test