Valgrind 与内存检测
Valgrind 是 Linux 下强大的内存检测工具,可以检测内存泄漏、非法内存访问、未初始化变量使用等。在 Windows 上,可以使用 Visual Studio 的调试器或 AddressSanitizer。内存检测工具是发现和修复内存问题的利器。
Valgrind 基本用法
# 编译时加 -g 保留调试信息
gcc -g program.c -o program
# 检测内存泄漏
valgrind --leak-check=full ./program
# 检测所有内存错误
valgrind --tool=memcheck --track-origins=yes ./program
检测内存泄漏
int main(void)
{
int *p = malloc(100); /* 泄漏 */
p[0] = 10;
/* 忘记 free(p) */
return 0;
}
Valgrind 输出:
==12345== 100 bytes in 1 blocks are definitely lost
==12345== at 0x4C2FB55: malloc (vg_replace_malloc.c:299)
==12345== by 0x40053E: main (test.c:5)
检测非法访问
int main(void)
{
int *p = malloc(10 * sizeof(int));
p[10] = 0; /* 越界访问 */
free(p);
return 0;
}
Valgrind 输出:
==12345== Invalid write of size 4
==12345== at 0x40054A: main (test.c:6)
==12345== Address 0x5203048 is 0 bytes after a block of size 40 alloc'd
检测未初始化变量
int main(void)
{
int x;
printf("%d\n", x); /* 使用未初始化变量 */
return 0;
}
AddressSanitizer(GCC/Clang)
# 编译时加 -fsanitize=address
gcc -fsanitize=address -g program.c -o program
./program
AddressSanitizer 在运行时检测内存错误,比 Valgrind 更快。
最佳实践
- 开发阶段定期用内存检测工具检查
- 持续集成中加入内存检测
- 修复所有检测到的错误
- 理解工具输出,定位问题根源
- 内存检测不能替代良好的编程习惯