【问题标题】:how to free an allocated array in a function in c如何在c中的函数中释放分配的数组
【发布时间】:2018-06-23 16:52:37
【问题描述】:

如果我们在main() 中使用malloc(),我们可以在free() 中使用main() 中的动态内存分配。

但是,如果我们在不同的函数中使用 malloc() 我们在main()中使用了那个函数,我们应该在哪里调用free()来释放在那个函数中分配的内存?

即,在以下源代码中:

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

int * memory_allocate_function(int);

int main(void) {
    int n=5; //length of array, 5 for example.
    int *my_array;
    my_array = memory_allocate_function(n);
    return 0;
}

int * memory_allocate_function(int n) {
    int i;
    int *array;
    array=(int *)malloc(n * sizeof(int));
    if(array == NULL) {
        printf("can not allocate memory.");
        return NULL;
    }
    // I think i can't use "free(array);" in here.
    // Because I need that array in main().
    return array;
}

这是最好的方法吗?

【问题讨论】:

  • 谁说如果你在main中调用malloc,你必须在main中调用free
  • 你是否真的尝试过放一个 free 并编译/运行?
  • 因为,是的,您可以而且应该在代码中可疑注释所在的位置使用免费权限。
  • 我解决了问题,现在我需要main()中的那个数组
  • 您的新评论是正确的。现在你在 main 中释放它。顺便说一句,在人们发布好的答案之后显着改变代码的含义是相当不和谐的。

标签: c function memory-management free dynamic-memory-allocation


【解决方案1】:

在你完成它之后 - free 动态分配的内存。但设计明智 - 您也可以在其他函数中调用 free 来正确管理它。这真的取决于。对此没有硬性规定。

例如,在这里你应该将该指针返回到分配的内存,然后在main 中使用它之后,你可以在main() 中释放它。

所以结构应该是这样的

int* memory_allocate_function(int n)
{
    int i;
    int *array;
    array = malloc(n*sizeof(int));
    if(array == NULL)
    {
        printf("can not allocate memory.");
        exit(0);
    }
     return array;
}

然后在main()

int main(void)
{
    int n=5;    //length of array, 5 for example.
    int *arr = memory_allocate_function(n);
    // work with arr
    free(arr);
    return 0;
}

但是是的 正确命名函数 - 如果您要使用名称 memory_allocate_function 函数,那么只能这样做 - 不应该有任何其他主要逻辑。这有助于创建可读性好的代码。


注意一件事 - 当你调用函数然后退出函数时,唯一的局部变量包含它的地址,它的存储持续时间结束了,你永远无法访问你分配的内存。这是一个内存泄漏的案例。如果您确定不会从函数返回指向内存的指针 - 然后使用它(在相同或不同的函数中)然后释放它(在函数范围结束之前 - 请注意不要提及您将在哪里释放它,您可以在相同的功能和其他功能中执行它。

我忍不住要提几件事:- 1)不要转换malloc的返回值。 2)检查malloc的返回值——如果是NULL你想单独处理。 3)main()的推荐签名是int main(void)

【讨论】:

  • 那么,如果我在 int main(void) 结尾的 return 0; 之前写 free(memory_allocate_function(n)); 会怎样?这是我的最后一个问题。
  • @Sillyon:是的,只要另一个函数的返回类型是 int* 并且从函数返回指向已分配内存的指针,您就可以这样做。现在您将只使用该函数中的内存来完成所有工作。
  • @coderedoc 好的,虽然它没有达到目的;我将只使用该功能中的内存来完成所有工作,对。感谢您的关注。
  • @Sillyon.:在 memory_allocate_function 中,您可以将指针传递给其他函数,该函数将使用它并使用它。但是在main 中,您应该调用free...它不能使用。
【解决方案2】:

如果您需要在一个函数中使用malloc 内存,而在另一个函数中使用free,则必须以某种方式小心地将指向malloced 内存的指针从malloc 点传递到您想要的点free它。

您有责任保留指针值并将其从一个函数传递给另一个函数,直到它到达free 点。如果您在此过程中丢失了该值,则会发生内存泄漏。内存泄漏就是您现在所拥有的,因为您没有将本地 array 指针传递到任何地方。

没有“一种真正的方法”可以做到这一点,因为这取决于您的具体意图。例如,您可以从memory_allocate_function 返回该指针,在main 接收它并最终在free 那里接收它

int *memory_allocate_function(int);

int main()
{
  int n = 5;
  int *arr = memory_allocate_function(n);
  ...
  free(arr);
  return 0;
}

int *memory_allocate_function(int n)
{
  int *array = malloc(n * sizeof *array);
  ...
  return array;
}

【讨论】:

    【解决方案3】:

    当不再需要内存时应该释放它。

    由于数组在memory_allocate_function 退出后将不再可访问(因为array 未返回或以其他方式可供外部访问),因此应在memory_allocate_function 退出之前将其释放。

    void memory_allocate_function(int n){
        int i;
        int *array;
        array = malloc(n*sizeof(int));
        if (array == NULL) {
            fprintf(stderr, "Out of memory.");
            exit(1);
        }
    
        // ... use the array ...
    
        free(array);
    }
    

    【讨论】:

    • 如果在函数结束时return array; 可以访问数组呢?
    • 内存在不再需要时应该被释放。它不必在分配它的同一个函数中。
    猜你喜欢
    • 2010-12-05
    • 2012-11-06
    • 1970-01-01
    • 2021-09-27
    • 2021-01-18
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多