【问题标题】:How to free 2d array in C?如何在 C 中释放二维数组?
【发布时间】:2011-08-05 16:34:59
【问题描述】:

我有以下代码:

int **ptr = (int **)malloc(sizeof(int*)*N); 
for(int i=0;i<N;i++) 
     ptr[i]=(int*)malloc(sizeof(int)*N));

如何使用free 释放ptr?我应该循环遍历ptr 和免费的ptr[i] 还是应该这样做

free(ptr) 

ptr 会被释放吗?

【问题讨论】:

标签: c memory-management


【解决方案1】:

与分配正好相反:

for(int i = 0; i < N; i++)
    free(ptr[i]);
free(ptr);

【讨论】:

  • 如果我尝试访问已被我释放的位置,它会出现分段错误吗?
  • @VaradBhatnagar:这实际上是未定义的行为。可能是分段错误——谁知道呢!
  • 我认为你不需要这里的第三行。
  • @MohamedIbrahim:不,它是必需的,因为 ptr 已分配:int **ptr = (int **)malloc(sizeof(int*)*N);
【解决方案2】:

您将不得不循环ptr[i],释放您遍历的每个int*,正如您首先建议的那样。例如:

for (int i = 0; i < N; i++)
{
    int* currentIntPtr = ptr[i];
    free(currentIntPtr);
}

【讨论】:

  • 出于好奇,用free(ptr[i]) 循环有什么问题?
  • 没什么,我可能有点太努力让我的代码在这里可读!
  • 嗨,詹姆斯,我尝试按照您编写的方式进行操作,但我的程序中断了。 _crtheap 0x0083000 void * pUserData 0x0083c408 const void * 你认为为什么会发生这种情况?基本上它是一个修改过请求大小的堆块,类似的东西!
  • @JamesBedford - 抱歉,我无法在上一个标签上标记你。
  • 只是为了更清楚地说明正在发生的事情。如果开发人员感兴趣,它还可以更轻松地设置断点并查看即将被释放的指针的值。
【解决方案3】:

是的,您必须遍历 ptr 并释放每个 ptr[i]。为避免内存泄漏,一般规则是:对于每个malloc(),必须有一个对应的free()

【讨论】:

    【解决方案4】:

    简单

    while (N) free(ptr[--N]);
    free(ptr);
    

    #define FALSE 0
    #define TRUE 1
    typedef int BOOL;
    
    void freev(void **ptr, int len, BOOL free_seg) {
        if (len < 0) while (*ptr) {free(*ptr); *ptr++ = NULL;}
        else while (len) {free(ptr[len]); ptr[len--] = NULL;}
        if (free_seg) free(ptr);
    }
    
    freev(ptr, N, TRUE); /* if known length */
    freev(ptr, -1, TRUE); /* if NULL-terminated */
    freev(ptr, -1, FALSE); /* to keep array */
    

    贵族

    GLib 函数:

    我发现没有 GLib 就很难进行任何严肃的 C 编程。它引入了诸如dynamic strings 之类的东西,并为functional programming 铺设了foundations。它确实应该是标准 C 运行时库的一部分。它会让 C 呼吸到新鲜空气。它将使 C 在 2019 年再次成为一种合理且具有竞争力的语言。但因为它不是,它会给你的应用程序增加 1 MB 的大小(无论是 DLL 大小还是可执行文件大小)。 Windows 发行版也是maintained by sadists

    【讨论】:

      【解决方案5】:
      for(int i=0;i<N;i++) free(ptr[i]);
      free(ptr);
      

      您没有检查 malloc 分配失败。你应该经常检查。

      【讨论】:

        【解决方案6】:

        void freeMatrix(int **matrix ,int row)
        {
            for(int i=0;i<row;i++)
            {
                free(matrix[i]);
            }
            free(matrix);
        }

        【讨论】:

        • 欢迎来到stackoverflow。如果您解释您提供的代码,您可能会发现您的答案更有价值。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-10
        • 1970-01-01
        • 2020-01-18
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多