【问题标题】:c - realloc() succeeds in Windows 7 but fails in Windows XP, why?c - realloc() 在 Windows 7 中成功,但在 Windows XP 中失败,为什么?
【发布时间】:2013-02-01 21:28:23
【问题描述】:

所以我的这段代码有以下realloc 块:

char **ptr = NULL;

void realloc_ptr(unsigned int new_size)
{    
    void *temp = NULL;

    temp = realloc(ptr, new_size * sizeof(*ptr));

    if(temp != NULL) {
        ptr = temp;
    }
    else {
        exit(EXIT_FAILURE);
    }
}

new_size 在调用此函数之前递增。这个数组总是只扩展。另外,new_size 在我的代码中永远不会超过 3(目前)。

现在上面的realloc 调用在我在Windows 7 中的测试过程中运行良好。当我在XP 中测试这段代码时,上面的代码会成功3 次,然后它会在第4 次抛出异常。当我回到代码时,我将发布确切的异常(这台计算机没有代码)。

我猜我的内存太碎片化,系统无法分配连续的内存块。我已经测试了我的代码是否存在内存泄漏并修复了所有问题(我希望如此)。任何想法为什么会发生这种情况?

编辑:

当我使用 Doug Lea 的malloc.c 时,上述问题就消失了。但我还是想知道为什么会这样。

谢谢!

【问题讨论】:

  • 顺便问一下,在您执行此操作时,new_size 是什么,以及每个配置中的内存模式(64 位与 32 位)。
  • 有 64 位 XP 吗?
  • new_size 总是大于当前大小。我一直在扩展这个数组。还有你所说的记忆模式到底是什么意思?
  • 请为我们提供一个最小的、可编译的测试用例。 Minimal 意味着“只使用足够的代码来重现问题,而不会混淆不相关的代码”,而可编译的意思是“使用足够的代码在我们的系统上编译而不填空或修复错误”。
  • @AnishRam 该测试用例不可编译。你的主要功能在哪里?

标签: c windows memory-management


【解决方案1】:

当我在 XP 中测试这段代码时,上面的代码会成功 3 次,然后会在第 4 次抛出异常。当我回到代码时,我会发布确切的异常(这台计算机没有代码)。

那(例外)意味着您在某处(可能未初始化)和/或内存损坏的地方有无效的指针(或索引)。 realloc() 必须静默失败,如果无法满足请求,则返回 NULL。

在不同的操作系统上有不同的行为是完全正常的。

【讨论】:

    【解决方案2】:

    我的最佳猜测是new_size 太大而无法在连续的虚拟内存中使用。您永远无法确定在 32 位系统上是否有大量连续的虚拟内存可用。

    您通常应该尝试使用多个较小的块,如果可能,甚至不要同时分配它们,而是在前一个被释放后分配下一个。

    【讨论】:

    • 嗯,也许我应该尝试这种方法。但是当我使用 Doug Lea 的malloc.c 时,从来没有出现过这个问题。
    • 如果 windows 没有足够的连续虚拟内存来提供,那么没有算法可以提供它。
    • 也许 realloc 完全按照你在回答中所说的那样做。
    猜你喜欢
    • 2012-07-17
    • 2014-12-01
    • 2014-02-06
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2011-03-21
    相关资源
    最近更新 更多