【问题标题】:Freeing a Realloc'd Array in C在 C 中释放 Realloc 的数组
【发布时间】:2015-06-17 04:41:39
【问题描述】:

我刚刚开始学习 malloc'd 和 realloc'd 数组。谁能帮我解释一下如何正确释放我的以下数组?我曾尝试查看其他帖子,但我很难理解 C 中的内存分配。

char ** result = NULL;
int numSpaces = 0;

char * p = strtok(command, " ");

/* split string and append tokens to 'result' */
while (p)
{
    result = realloc (result, sizeof (char*) * ++numSpaces);

    if (result == NULL)
        exit (-1); /* memory allocation failed */

    result[numSpaces-1] = p;

    p = strtok(NULL, " ");
}

【问题讨论】:

    标签: c arrays dynamic realloc


    【解决方案1】:

    释放realloc-ed 内存与释放malloc-ed 内存没有什么不同,因为当您不再需要内存时,您只需在最后的result 上调用free

    但是,您的代码有一个可能导致内存泄漏的模式:您将realloc-ed 块分配回result,而没有检查NULL。如果realloc 失败,则result 的先前值将无法恢复,因为它已被NULL 覆盖。

    以下是解决此问题的方法:

    char **temp = realloc(result, sizeof (char*) * ++numSpaces);
    
    if (temp == NULL) {
        free(result); // Free the old memory block
        exit (-1); /* memory allocation failed */
    }
    result = temp;
    

    【讨论】:

    • 他们正在检查这种情况。 if (result == NULL)。他们通过终止应用程序来处理它。
    • @BillLynch 他们对分配进行空检查,但为时已晚:那时旧的 result 已经不复存在了。
    • 谢谢,现在可以使用了。我在看一些例子,他们在 for 循环中有 free() 和其他东西,所以我有点不确定。干杯!
    • 没有内存泄漏,因为代码在 realloc 失败时终止程序。担心退出时释放是操作系统特有的问题。在正确清理进程的系统上,迭代数据结构并释放它们只是浪费周期。对于处理大量对象的程序,它可能会在关闭过程中造成显着延迟,尤其是当它们被分页到磁盘时。
    • @Kaz 这是一个学习练习,而不是一个生产系统。重要的是从一开始就学习正确的模式,以避免在编写生产代码时出现错误,系统不会因realloc 失败而退出,而是执行其他操作。
    【解决方案2】:

    在您使用完result 之后的某个时间点,您需要致电free(result);

    这可能看起来像:

    char ** result = NULL;
    int numSpaces = 0;
    
    char * p = strtok(command, " ");
    
    while (p) {
        result = realloc (result, sizeof (char*) * ++numSpaces);
        result[numSpaces-1] = p;
        p = strtok(NULL, " ");
    }
    
    for (i=0; i<numSpaces; ++i)
        printf("word %d: %s\n", i, result[i]);
    
    free(result);
    

    【讨论】:

    • 谢谢,现在可以了。我在看一些例子,他们在 for 循环中有 free() 和其他东西,所以我有点不确定。干杯!
    猜你喜欢
    • 2018-03-26
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2012-10-08
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多