Linux:开发:valgrind报错问题总结(2022新)
仅记录个人使用中遇到的问题,可能不会很多,以后慢慢补充
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[]
- 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.txt
at xxxxxxxx
by xxxxxxxx
by xxxxxxxx
......
7.xx bytes in 1 blocks are definitely lost in loss record xx of xx
这个是说下面提示信息中的内存"definitely lost"(肯定泄露),一般也是类似于malloc了没有free