2011-07-14 50 views
3

例如,我想這樣的功能:爲什麼標準C庫沒有像realloc()沒有數據複製功能?

char *dst = (char*)malloc(512); 
char *src = (char*)malloc(1024); 
... 
dst = (char*)realloc(dst, 1024); 
memcpy(dst, src, 1024); 

正如你看到的,我只是想在函數realloc()的擴展緩衝區的大小,但realloc的()的C庫可以複製舊數據地址。那麼是否有像我想要的任何庫中的函數?

+4

如果你不關心舊內容,爲什麼不只是'free' /'malloc'緩衝區? – Mat

+4

不要施加'malloc()'的返回值。它充其量是多餘的,並且可能隱藏編譯器在其不在時發生的錯誤。 – pmg

+0

不幸的是,你必須在C++編寫C-esk代碼時進行強制轉換。我敢打賭那是怎麼回事。 – user606723

回答

1

realloc嘗試在不復制的情況下擴展緩衝區,但只能在多餘空間空閒的情況下才能這樣做。

在你的情況下,你只是分配空間爲src和該內存塊可能已經使用了空間realloc將需要。在那種情況下,它只能在其他地方分配一個更大的塊並將數據複製到該塊。

+0

是的,你是對的。其實我的意思是像... – legendlee

+0

謝謝。你是對的。實際上我的意思是像...使用HeapReAlloc()和flag = HEAP_REALLOC_IN_PLACE_ONLY來嘗試擴展緩衝區大小,如果失敗,只需分配一個新的部分而不復制數據。你知道HeapReAlloc()是OS API,我不想處理堆。所以我想也許應該有一個像C庫中我想要的功能。 – legendlee

5

爲什麼不乾脆:

free(dst); 
dst = malloc(1024); 

還要注意的是realloc可移動模塊以及調整其大小,所以拿着以前調用返回malloccallocrealloc舊指針可能不再引用同一塊。

+2

如果重新分配失敗,realloc可能會丟失指針。 –

+0

@tristopia,不知道。謝謝。 – user606723

+3

@tristopia:如果重新分配失敗,'realloc'不會丟失舊的指針。相反,破壞**調用代碼**,在覆蓋舊指針之前不檢查失敗是什麼會導致它丟失。 –

0

那麼有沒有像我想要的任何庫中的函數?

不,沒有。如果沒有空間,系統應該如何擴展內存?

例如想像你這樣做:

char *a = malloc(2); 
char *b = malloc(2); 

分配現在可能看起來像內存:

 
1 2 3 4 5 6 7 
------------------------- 
| | | | | | | 
------------------------- 
\  /\  /\ /  
\ /\ /\ /
    v  v  v 
memory unused/ memory 
for "a" internal for "b" 
     memory piece 

現在你做realloc(a,10);。系統不能簡單地擴展「a」的記憶片段。它會碰到由「b」使用的內存,所以它必須在內存中找到具有10個連續空閒字節的另一個地方,複製舊內存塊的2個字節並返回一個指向這些新的10個字節的指針。

+3

是的,你說得對,所以「移動」操作經常進行。但是我希望系統做的是「如果你不能擴展這個片斷,只是分配一個新片斷,但不要複製數據,我不需要它」。 – legendlee

+0

@legendlee標準C中不存在這樣的事情。如果你不關心數據,你不能只使用malloc()嗎? – nos

+0

@nos你需要先獲得一個免費的,然後是一個malloc。雖然在這個假設的操作中,如果可能的話,您首先嚐試擴展分配的內存而不釋放內存,這可*更高效。 – Antonio

相關問題