MST
星途 面试题库

面试题:C语言malloc和free使用中的内存泄漏问题

假设你有一段C代码,其中多次调用了malloc分配内存,但在程序结束前却没有正确释放所有分配的内存,导致内存泄漏。请分析下面这段代码中可能导致内存泄漏的地方,并修改代码以避免内存泄漏。代码如下: ```c #include <stdio.h> #include <stdlib.h> int main() { int *ptr1 = (int *)malloc(5 * sizeof(int)); if (ptr1 == NULL) { return 1; } int *ptr2 = (int *)malloc(10 * sizeof(int)); if (ptr2 == NULL) { free(ptr1); return 1; } // 在此处添加一些对ptr1和ptr2的操作 ptr1 = (int *)malloc(20 * sizeof(int)); if (ptr1 == NULL) { free(ptr2); return 1; } // 更多操作 return 0; } ```
39.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

分析可能导致内存泄漏的地方:

  1. 当执行 ptr1 = (int *)malloc(20 * sizeof(int)); 时,原本 ptr1 指向的由 malloc(5 * sizeof(int)) 分配的内存没有释放,导致内存泄漏。

修改后的代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr1 = (int *)malloc(5 * sizeof(int));
    if (ptr1 == NULL) {
        return 1;
    }
    int *ptr2 = (int *)malloc(10 * sizeof(int));
    if (ptr2 == NULL) {
        free(ptr1);
        return 1;
    }
    // 在此处添加一些对ptr1和ptr2的操作
    int *temp = ptr1;
    ptr1 = (int *)malloc(20 * sizeof(int));
    if (ptr1 == NULL) {
        free(ptr2);
        free(temp);
        return 1;
    }
    free(temp);
    // 更多操作
    free(ptr1);
    free(ptr2);
    return 0;
}

在上述修改后的代码中,使用临时变量 temp 保存 ptr1 原来的地址,在重新分配 ptr1 内存后,先释放 temp 指向的内存,在程序结束前也分别释放 ptr1ptr2 指向的内存,从而避免内存泄漏。