面试题答案
一键面试常见导致内存泄漏的场景
- 动态内存分配后未释放:例如使用
malloc
、calloc
、realloc
分配内存后,程序结束时没有调用free
释放。 - 在循环内不断分配内存但未释放:在循环体中重复执行动态内存分配操作,却没有及时释放之前分配的内存。
- 指针赋值导致原指向内存无法释放:当一个指针重新赋值时,原指向的动态分配内存没有被释放,如
p1 = p2
,如果p1
之前指向动态分配内存且没有释放,就会造成泄漏。
检测内存泄漏方法
使用Valgrind
- 安装Valgrind:在Linux系统上可通过包管理器安装,如
apt-get install valgrind
(针对Debian、Ubuntu等)。 - 编译程序:编译时确保添加调试信息,如
gcc -g -o your_program your_program.c
。 - 运行检测:使用
valgrind --leak-check=full./your_program
运行程序,Valgrind会详细报告内存泄漏的位置、大小等信息。
通过代码逻辑检测
- 记录内存分配和释放:可以编写自定义的内存分配和释放函数,在函数内部记录每次分配和释放的信息,程序结束时检查是否所有分配都已释放。
- 智能指针模拟:虽然C语言没有原生智能指针,但可以通过结构体和函数模拟类似机制,确保内存被正确管理和释放。