文章目录
Valgrind 是一个不可或缺的工具,它为 Linux 程序的内存泄漏检测和堆栈分析提供了强大的支持。
1.设计案例
定义一个结构体变量并初始化,放到堆上,不能内存泄漏。
#include <stdio.h>
#include <stdlib.h>//使用malloc函数
typedef struct student{
int id;
char *name;
}stu,*stup;
#define MAX 10
int main()
{
stup ptr = (stup)malloc(sizeof(stu)); // 分配内存,堆区
if (ptr == NULL) {
printf("Memory allocation failed\n");
return 1; // Exit if memory allocation fails
}
ptr->id = 1; // 设置学号,堆区
ptr->name = (char *)malloc(MAX * sizeof(char)); // 分配内存,堆区
if (ptr->name == NULL) {
printf("Memory allocation for name failed\n");
free(ptr); // Free previously allocated memory
return 1; // Exit if memory allocation fails
}
ptr->name[0] = 'A'; // 设置姓名,堆区
ptr->name[1] = '\0'; // 设置字符串结束符
printf("ID: %d, Name: %s\n", ptr->id, ptr->name); // 输出学号和姓名
free(ptr->name); // 释放姓名的内存
//free(ptr); // 释放学号的内存
ptr = NULL; // 将指针置为NULL,防止悬空指针
printf("Memory freed successfully\n");
return 0;
}
2.检查内存泄漏情况
-
vim storage.c (编写.c文件)
-
安装检测工具valgrind
sudo apt install valgrind -
检测内存泄露
gcc storage.c -o storage
valgrind ./storage
可以输出申请、释放内存块数,精确计算丢失了多少内存。 -
观测是否注释free(ptr);的影响:
内存正常释放:
内存泄露
参考资料
- 利用 Valgrind 进行 Linux 程序内存泄漏与堆栈分析检测https://my.oschina.net/emacs_8822976/blog/17349289