MST

星途 面试题库

面试题:C语言中常见导致内存泄漏的代码场景有哪些

请举例说明在C语言编程过程中,哪些常见的代码写法可能会导致内存泄漏,并简要阐述原因。
18.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 动态内存分配后未释放
    • 示例代码
#include <stdio.h>
#include <stdlib.h>

void memoryLeakExample1() {
    int *ptr = (int *)malloc(sizeof(int));
    // 这里没有free(ptr)
}
  • 原因malloc函数用于在堆上分配内存空间,分配成功后返回一个指向该内存的指针。如果在程序结束前没有使用free函数释放这块内存,这块内存就无法被系统回收,导致内存泄漏。即使函数执行完毕,指针ptr超出作用域被销毁,但它所指向的内存依然存在,却无法再访问和释放。
  1. 内存释放后继续使用指针
    • 示例代码
#include <stdio.h>
#include <stdlib.h>

void memoryLeakExample2() {
    int *ptr = (int *)malloc(sizeof(int));
    *ptr = 10;
    free(ptr);
    // 这里继续使用ptr是错误的,可能导致内存泄漏和未定义行为
    printf("%d\n", *ptr);
}
  • 原因:当调用free(ptr)后,ptr所指向的内存已被释放回系统。此时再使用ptr访问内存,一方面这块内存可能已被系统重新分配给其他用途,导致数据错误;另一方面,系统会认为程序对已释放的内存进行非法访问,这是一种未定义行为。如果后续又重新分配内存,而原指针仍指向已释放的地址,就可能造成内存无法正确管理,间接导致内存泄漏。
  1. 在循环中频繁分配内存但未释放
    • 示例代码
#include <stdio.h>
#include <stdlib.h>

void memoryLeakExample3() {
    for (int i = 0; i < 10; i++) {
        int *ptr = (int *)malloc(sizeof(int));
        // 这里没有在每次循环结束时释放ptr
    }
}
  • 原因:每次循环都会分配一块新的内存,但都没有释放。随着循环次数增加,会不断有新的内存被分配且无法回收,造成大量内存泄漏,最终可能耗尽系统的堆内存资源。
  1. 函数返回动态分配的内存指针,但调用者未释放
    • 示例代码
#include <stdio.h>
#include <stdlib.h>

int* createArray() {
    int *arr = (int *)malloc(10 * sizeof(int));
    return arr;
}

void memoryLeakExample4() {
    int *result = createArray();
    // 这里没有free(result)
}
  • 原因createArray函数分配了内存并返回指针,调用函数memoryLeakExample4接收了这个指针,但如果在memoryLeakExample4函数中没有释放result所指向的内存,这块内存就无法被回收,导致内存泄漏。