【问题标题】:C - Free a definite Amount of Memory (char**)C - 释放一定数量的内存 (char**)
【发布时间】:2013-01-29 07:38:59
【问题描述】:

我必须安全地释放一个数组:char** a; 它就像一个字符串列表。我知道我有多少char*。但是我很难释放所有的内存。有没有我可以使用的函数来释放 20 个字节?我试过了:

for (int i = 0; i < length; i++)
    if (a[i] != null)
        free(a[i]); // some of a[i] ARE null, non-null have different sizes
free(a); // crashes here

但我在asm 调试时遇到运行时错误。 a 中的所有内容都已分配。对于一个 I malloced 5 个字符串(每个指针 4 个字节)-> 20 个字节。如何释放整个char**

【问题讨论】:

  • 您可能在其他地方有内存错误。尝试使用内存泄漏检测器(例如 Linux 上的 valgrind
  • 什么运行时错误?他们都是malloced

标签: c arrays memory free


【解决方案1】:

除非分配 20 个字节,否则不能释放 20 个字节。你只能释放一个块。该块的大小在分配时指定。对于分配的每个块,您需要单独取消分配。

您可以尝试使用realloc 更改块的大小,但这不会删除该块的任意部分。

如果数组和数组中的单个项目都已使用malloc 分配,那么您的方法是正确的。释放每个元素,然后释放数组:

char **arr = malloc (10 * sizeof (char*));
if (arr != NULL)
    for (int i = 0; i < 10; i++)
        arr[i] = malloc (50 + i * 10); // sizes 50, 60, 70, ..., 140

// Use the ten X-character arrays here
//     (other than NULL ones from malloc failures, of course).

if (arr != NULL) {
    for (int i = 0; i < 10; i++)
        free (arr[i]);           // Okay to free (NULL), size doesn't matter
    free (arr);
}

【讨论】:

  • 这就是我分配和释放的方式。我的 prog 在 free(arr) 处崩溃;如果我之前用strncpy 写信给 arr[i] 有关系吗?
  • 仅当您为它分配的缓冲区溢出时。听起来您在其他地方遇到了问题,正在破坏内存领域。
  • 谢谢!我的 free-routine 更复杂,所以我没有看到我在释放项目时正在修改 arr 指针。
【解决方案2】:

如果您已正确分配 char** 数组及其包含指向的所有 char* 数组,则您发布的代码应该可以工作。您的其余代码是什么样的?

【讨论】:

    【解决方案3】:

    您发布的代码没有任何问题。 但是,如果您两次释放同一块内存,则可能会出现运行时错误。 检查您的其余代码,并确保您实际上分配了该数组中的所有内存,并且没有多次释放它。

    【讨论】:

    • 在调用free 之后,将指针设置为NULL 通常很有用。然后,使用调试器,您可以查看指针是否已被释放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2018-04-19
    • 1970-01-01
    • 2019-10-14
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多