2013-02-17 60 views
2

所以我的这个代码有以下realloc块:c - realloc()在Windows 7中成功但在Windows XP中失败,为什么?

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。但我仍然想知道为什么会发生这种情况。

谢谢!

+3

副手,你做这件事的时候'new_size'是什么,还有每个配置中的内存模式(64位与32位)。 – WhozCraig 2013-02-17 09:05:59

+0

是否有64位XP? – 2013-02-17 09:08:21

+0

'new_size'将总是大于当前的大小。我一直在扩大这个阵列。还有什么是完全由内存模式意味着什么? – 2013-02-17 09:09:02

回答

2

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

您通常应该尝试使用多个较小的块,并且如果可能的话,甚至不会同时分配所有块,但在前一个被释放之后分配下一个块。

+0

嗯,也许我应该尝试这种方法。但是当我使用Doug Lea的[malloc.c](http://gee.cs.oswego.edu/pub/misc/malloc.c)时,这个问题从未发生过。 – 2013-02-17 09:26:09

+0

如果windows没有足够的连续虚拟内存提供,那么NO算法可以提供它。 – 2013-02-17 09:35:20

+0

也许realloc的确如你在回答中所说的那样。 – 2013-02-17 10:21:07

2

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

这个(例外)意味着你在某处(可能是未初始化的)和/或内存损坏有无效的指针(或索引)。 realloc()必须以无提示方式失败并在请求不能满足时返回NULL。

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

+0

嗯内存损坏,我想我会看看,谢谢! – 2013-02-17 10:22:39

相关问题