2012-07-18 27 views

回答

11

realloc的具體用處在於你需要free使用前:存在增長已經被分配的內存。

所以它不是必需的,並且不常見。當通過NULL指針時,realloc表現爲malloc。如果您在致電之前使用free,那麼最好使用malloc

因爲您省略了錯誤處理,所以這兩個示例都不正確。所有的分配器可以返回NULL,在這方面使用realloc有點棘手。仔細閱讀文檔和示例。具體來說,ptr = realloc(ptr, ...總是一個壞主意,因爲如果realloc失敗並返回NULL,那麼你剛剛失去了你的引用和泄漏的內存。而是使用tmp變量,例如:

tmp = realloc(ptr, newSize); 
if (tmp != NULL) 
    ptr = tmp; 
else handle_error(); 
+0

謝謝,如果不需要保留'myArray'指向的數據,哪個選項會更高效? – 2012-07-18 19:45:25

+2

如果中間'free'是不必要的,那麼忽略它就更有效了。 – pb2q 2012-07-18 19:51:05

2

號爲什麼?整個realloc的要點是它重新分配現有的內存塊,保留已存儲在該內存塊中的值。這個想法是,在某些情況下,它可能會重用現有的內存位置,而不是分配一個全新的內存塊,並在那裏複製舊值。

如果不關心保留舊塊的內容,那麼根本就不需要realloc

還應該提到的是,realloc的功能還涵蓋了mallocfree的功能,給定了適當的參數值。你在代碼的第二個循環中所做的實質上是在純malloc模式下使用realloc

4

這取決於你想要做什麼。 realloc()專門設計用於獲取現有分配並更改其大小,儘可能多地保留數據。你提供的兩個例子在編譯時都是正確的,但它們會做不同的事情。

realloc(NULL, n)相同malloc(n),所以第二殼體在語義上等同於:

for(i = 0; i < n; i++){ 
    myArray = (int *)malloc(i*sizeof(int)); 
    free(myArray); 
    myArray = NULL; 
} 

在第一個例子中,數據指向myArray將被保留。在第二個示例中,現有分配將被丟棄,並替換爲全新的未初始化分配。任何由原始分配指向的數據都將被丟棄。


應當指出的是,realloc()將返回NULL如果分配失敗 - 但如果你通過它非NULL指針則該配置將不會被釋放。將一個指針傳遞到realloc(),並將結果直接分配給到同一個指針變量,如果重新分配失敗,可能會導致內存泄漏,因爲原始分配仍然存在。正確的方法是使用臨時指針變量。

5

兩者都不是。你應該總是檢查realloc返回NULL;如果你不這樣做,你會漏出內存。此外,您正在轉換分配器函數的返回值,即not advisable。另外,最好使用sizeof(*myArray)而不是明確的sizeof(type)構造,因爲如果稍後更改數組/指針的類型,並且您也忘記在此處更改類型,則會面臨難以追蹤的問題段錯誤和/或內存泄漏錯誤。總結:

for(i = 0; i < n; i++){ 
    int *tmp; 
    tmp = realloc(myArray, i*sizeof(*myArray)); 
    if (tmp == NULL) 
    { 
     free(myArray); 
     /* And handle error */ 
    } 
    myArray = tmp; 
} 

噢,好吧,實際上回答你的問題:你不需要free()。

相關問題