【问题标题】:Failing freeing a 2d dimensional array dynamically allocated无法释放动态分配的二维数组
【发布时间】:2015-04-24 13:13:29
【问题描述】:

考虑以下代码:

#include <stdio.h>

char** baz_alloc(int size)
{
    char ** b = malloc((size+1) * sizeof(char*));
    for (int i = 0; i < size; i++)
        b[i] = "baz";
    b[size] = NULL;

    return b;
}

void baz_print(char** baz)
{
    char** b = baz;
    while (*b != NULL)
    {
        printf("%s\n", *b);
        b++;
    }
}

void baz_free(char** baz)
{       
    int len = 0;
    char** b = baz;
    for (; *b != NULL; len++, b++);

    for (int i = 0; i < len; i++)
        free(baz[i]);
    free(baz);
}

int main()
{
    char** baz = baz_alloc(10);
    baz_print(baz);
    baz_free(baz);

    getch();
    return 0;
}

程序在调用free 函数时崩溃。我在 SO 上看过类似的例子,它看起来几乎一样。我的代码有什么问题?

谢谢。

【问题讨论】:

    标签: c arrays memory memory-management


    【解决方案1】:

    你在这个指针上调用free()

    b[i] = "baz"
    

    该指针没有分配给malloc()(或calloc()realloc()等)。

    【讨论】:

      【解决方案2】:

      你不能释放一个字符串字面量

      free(baz[i]);
      

      试图摆脱

      b[i] = "baz";
      

      作为一项规则:仅释放您分配的内容,分配位置(在导致分配的最顶层函数中),以相反的分配顺序。

      例如:

      int main()
      {
        char** baz = baz_alloc(10); //'creating' baz
        baz_print(baz); //using baz
        baz_free(baz); //freeing baz
        [...]
      }
      

      是非常好的做法。

      您的 baz_free 函数只需要使用 1 个 free,因为在 baz_alloc 中只调用了 1 个 malloc

      //Allocation
      char ** b = malloc((size+1) * sizeof(char*));
      
      //Freeing
      free(b); // or in your function free(baz);
      

      如果您的 baz_alloc 函数具有 b[i] = malloc(...) 您的 baz_free 代码将 - 几乎 - 正确(您不需要迭代两次,您可以在第一个循环中调用 free(b))。

      【讨论】:

        【解决方案3】:

        这个循环:

        for (int i = 0; i < len; i++)
            free(baz[i]);
        

        不应该存在,因为内存从未分配过。

        但是下面一行:

        free(baz);
        

        需要在那里,因为指向 char 的初始指针数组是通过调用 malloc() 创建的。

        【讨论】:

          猜你喜欢
          • 2022-01-15
          • 2018-09-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-24
          • 1970-01-01
          • 2019-07-25
          • 2016-02-16
          相关资源
          最近更新 更多