2013-02-17 66 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

相關問題