2

所以我的这段代码有以下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时,上述问题就消失了。但我仍然想知道为什么会这样。

谢谢!

4

2 回答 2

2

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

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

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

于 2013-02-17T09:14:24.910 回答
2

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

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

于 2013-02-17T09:11:49.850 回答