首页 > 解决方案 > 此代码是否会造成内存泄漏以及如何对其进行测试

问题描述

嗨,我有一个源代码 C,如下所示:

#include <stdio.h>
#include <stdlib.h>
void test(int *a,int n)
{
    a=(int*)malloc(n * sizeof(int)); 
    for(int i=0;i<n;i++)
        a[i] = i+1;
}
int main()
{
    int *ptr;
    int n;
    n = 5;
    printf("Enter number of elements: %d\n", n);
    test(ptr,n);
    if (ptr == NULL) { 
        printf("Memory not allocated.\n");
    }
    else { 
     //...
    } 
    return 0; 
}

据我了解,当我们调用函数test时,程序会创建一个pointerptr的影子放在test里面,然后当我们退出test时,ptr的影子会被删除所以在main()ptr中仍然存在NULL,但是在test里面我们有malloc一个 ptr 内存,这个内存在heap我们测试结束时它不是空闲的。所以如果我多次调用测试,这会导致内存泄漏,这是真的吗?我怎样才能用free()main 函数释放这个内存?

标签: cpointersmemory-leaksmallocfree

解决方案


据我了解,当我们调用函数 test 时,程序会创建一个指针 ptr 的影子放在 test 中,然后当我们退出 test 时,ptr 的影子将被删除,所以在 main() 中 ptr 仍然为 NULL,但是在测试中,我们有一个用于 ptr 的 malloc 内存,这个内存在堆中,当我们退出测试时它不是空闲的。所以如果我多次调用测试,这会导致内存泄漏,这是真的吗?

你的理解是正确的。调用一次函数就足以导致内存泄漏。

以及如何在 main 中使用 free() 函数释放此内存?

您必须将指针返回给调用者才能启用它。看到这个:
动态内存访问只在函数内部起作用


推荐阅读