仅记录个人使用中遇到的问题,可能不会很多,以后慢慢补充

Valgrind问题总结

    • 1.Conditional jump or move depends on uninitialised value(s)
    • 2.xxx blocks are still reachable in loss record xxx of xxx
    • 3.still reachable: xxx bytes in xxx blocks
    • 4.Invalid free() / delete / delete[]
      • 4.1非法释放野指针
      • 4.2重复释放内存
      • 4.3此问题补充
    • 5.Invalid write of size xxx
    • 6.FILE DESCRIPTORS: xx open at exit.
    • 7.xx bytes in 1 blocks are definitely lost in loss record xx of xx

1.Conditional jump or move depends on uninitialised value(s)

某些变量未初始化,检查一下数组/class/struct有没有赋初值,或者说看看初始化的大小是否为正确的大小,下面信息会提示在哪个函数里面。

2.xxx blocks are still reachable in loss record xxx of xxx

程序员创建的内存块没有被主动释放,注意使用后的malloc/calloc内存要free,这种情况一般不会造成什么大问题。当然,另一个层面上的”still reachable”的意思是程序中的某个指针丢失,无法指向原来的内容,则无法释放,才是真正意义上的内存泄漏。

3.still reachable: xxx bytes in xxx blocks

和上面的情况类似,可能是malloc或者calloc后未释放(free),或者打开的文件忘了fclose,具体情况可以在valgrind运行命令后加上-show-reachable=yes看看问题出在哪里

4.Invalid free() / delete / delete[]

这个时候就分两种情况了。

4.1非法释放野指针

非法释放野指针的话就会有这样的提示在第三行:by 0xyyyyyyyy: mem_free_wild_pointer (in 你的程序路径),不知道野指针是啥的自己百度。

4.2重复释放内存

重复释放内存的提示稍有不同:by 0xyyyyyyyy: mem_double_free (in 你的程序路径),这个报错的意思就是你double free(即重复释放同一块内存)了,检查一下重复free的情况,只free一次即可。

4.3此问题补充

此报错下面还有一部分,就是类似于Address 0xxxxxxxx is 0 bytes inside a block of size 1 free'd这种提示,无伤大雅。

5.Invalid write of size xxx

动态内存越界,下面还有Address 0xxxxxxxxx is 0 bytes inside a block of size 1 alloc'd,可以检查一下数组下标之类的。

6.FILE DESCRIPTORS: xx open at exit.

文件指针未关闭,类似这样提示的不用管:

Open file descriptor 0: /dev/pts/4<inherited from parent>

真正有问题的提示,下面还会给一堆信息告诉你在哪,一般从下往上开始读,比如:

Open file descriptor 3: test.txtat xxxxxxxxby xxxxxxxxby xxxxxxxx......

7.xx bytes in 1 blocks are definitely lost in loss record xx of xx

这个是说下面提示信息中的内存”definitely lost”(肯定泄露),一般也是类似于malloc了没有free