网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
使用Memcheck
,可以检查很多内存方面的问题,诸如:
- 对未初始化内存的使用
- 内存释放后再次被使用
- 访问非法内存地址
- 内存泄漏,即指向一块内存的指针永久性地丢失
- 内存被
double free
memcpy
相关函数中的dst
和src
指针重叠
下面,我们就以一个简单的例子来探讨下,如何使用valgrind
来检测内存泄露的问题。
首先,valgrind
工具需要安装,安装命令如下:
yum install -y valgrind
valgrind
的命令行参数解释:
选项 | 说明 |
---|---|
-tool=<name> | 运行 valgrind 中名为toolname 的工具。默认m`emcheck |
h –help | 显示帮助信息 |
-version | 显示valgrind 内核的版本 |
q –quiet | 静默运行,只打印错误信息 |
v –verbose | 更详细的信息, 增加错误数统计 |
`-trace-children=no | yes` |
`-track-fds=no | yes` |
`-time-stamp=no | yes` |
-log-fd=<number> | 输出LOG 到描述符文件 [2=stderr ] |
-log-file=<file> | 将输出的信息写入到filename.PID 的文件里,PID 是运行程序的进行ID |
-log-file-exactly=<file> | 输出LOG 信息到 file |
-log-file-qualifier=<VAR> | 取得环境变量的值来做为输出信息的文件名。 [none ] |
-log-socket=ipaddr:port | 输出LOG 到socket ,ipaddr:port |
-xml=yes | 将信息以xml 格式输出,只有memcheck 可用 |
-num-callers=<number> | 调用栈层级[12 ] |
`error-limit=no | yes` |
-error-exitcode=<number> | 如果发现错误则返回错误代码 [0=disable ] |
`-db-attach=no | yes` |
-db-command=<command> | 启动调试器的命令行选项[gdb -nw %f %p ] |
`-leak-check=no | summary |
`-leak-resolution=low | med |
`-show-reachable=no | yes` |
接下来,我们以一个具体的例子来说明下如何使用valgrind来检查内存泄漏。示例代码如下:
#include<malloc.h>
int main(void){
void \*p1 = malloc(10);
void \*p2 = malloc(20);
free(p1);
void \*p3 = malloc(30);
free(p3);
return 0;
}
运行命令如下:
gcc leak.c -g
valgrind --tool=memcheck --leak-check=full ./a.out
运行后,得到如下结果:
==229181== Memcheck, a memory error detector
==229181== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==229181== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==229181== Command: ./a.out
==229181==
==229181==
==229181== HEAP SUMMARY:
==229181== in use at exit: 20 bytes in 1 blocks
==229181== total heap usage: 3 allocs, 2 frees, 60 bytes allocated
==229181==
==229181== 20 bytes in 1 blocks are definitely lost in loss record 1 of 1
==229181== at 0x4C29F73: malloc (vg_replace_malloc.c:309)
==229181== by 0x40059C: main (leak.c:5)
==229181==
==229181== LEAK SUMMARY:
==229181== definitely lost: 20 bytes in 1 blocks
![img](https://img-blog.csdnimg.cn/img_convert/b4a58a18b0e9f9c21ceb8685882e2d2e.png)
![img](https://img-blog.csdnimg.cn/img_convert/579cf1daf422fb98f254cfc15a5231ab.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**