MST

星途 面试题库

面试题:C语言中内存泄漏场景及检测方法

描述几种在C语言编程中可能导致内存泄漏的常见场景,例如动态内存分配后未释放等。同时,说明至少两种用于检测这些内存泄漏的方法,包括手动代码检查和使用工具等,并阐述每种方法的优缺点。
32.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

常见内存泄漏场景

  1. 动态内存分配后未释放:使用 malloccallocrealloc 分配内存后,没有使用 free 释放。例如:
void memoryLeakExample1() {
    int *ptr = (int *)malloc(sizeof(int));
    // 这里没有free(ptr)
}
  1. 内存释放后继续使用:释放内存后,指针没有置为 NULL,导致可能再次使用已释放的内存。
void memoryLeakExample2() {
    int *ptr = (int *)malloc(sizeof(int));
    free(ptr);
    // 这里如果继续使用ptr,会导致未定义行为,可能也间接导致内存泄漏
    *ptr = 10; 
}
  1. 函数返回局部动态分配内存的指针:函数内部分配的动态内存,返回后外部没有正确管理,导致无法释放。
int* memoryLeakExample3() {
    int *ptr = (int *)malloc(sizeof(int));
    return ptr;
}
void callFunction() {
    int *result = memoryLeakExample3();
    // 这里没有释放result指向的内存
}
  1. 循环内多次分配内存但未及时释放:在循环中重复分配内存,每次迭代没有释放之前分配的内存。
void memoryLeakExample4() {
    for(int i = 0; i < 10; i++) {
        int *ptr = (int *)malloc(sizeof(int));
        // 没有在每次迭代结束时free(ptr)
    }
}

检测内存泄漏的方法

  1. 手动代码检查
    • 优点:不需要额外工具,对小型项目或简单代码片段可快速排查,能深入理解代码逻辑,发现逻辑错误导致的内存问题。
    • 缺点:效率低,易遗漏,对于大型复杂项目难以全面检测,代码量大时工作量巨大,需要开发者对内存管理有深入理解。
  2. 使用Valgrind(Linux环境)
    • 优点:功能强大,能准确检测出内存泄漏位置,提供详细报告,可检测多种内存错误,如非法内存访问。
    • 缺点:仅适用于Linux环境,会显著降低程序运行速度,增加内存消耗,对多线程程序检测较复杂。
  3. 使用Purify(商业工具,跨平台)
    • 优点:跨平台,检测能力强,能检测各种复杂内存问题,提供详细诊断信息,可集成到开发环境。
    • 缺点:商业工具需购买许可证,价格昂贵,可能影响程序性能。