2009-11-15 29 views
10

我想知道是否C或C++標準的保證,當realloc的是帶一個小的(非零)大小的指針沒有改變:如果新尺寸變小可以重新移動指針嗎?

size_t n=1000; 
T*ptr=(T*)malloc(n*sizeof(T)); 
//<--do something useful (that won't touch/reallocate ptr of course) 
size_t n2=100;//or any value in [1,n-1] 
T*ptr2=(T*)realloc(ptr,n2*sizeof(T)); 
//<-- are we guaranteed that ptr2==ptr ? 

基本上,可以在OS決定自己,既然我們釋放一個大內存塊,他想利用所有的realloc來整理內存,並以某種方式移動ptr2?

回答

6

隨着realloc,你絕對不能保證記憶將在哪裏生活。我相信libc的默認malloc只會勉強地複製周圍的內存,所以實際上你可能沒問題。但不要指望它。

16

http://opengroup.org/onlinepubs/007908775/xsh/realloc.html

在與一個大小不等於0成功完成,realloc()的返回一個指針(可能移動)分配的空間。

不,不保證

+1

早先在那個頁面上,它說:「realloc()函數將ptr指向的內存對象的大小更改爲由size指定的大小。對象的內容將保持不變,直到new和如果內存對象的新大小需要移動對象,則先前實例化對象的空間將被釋放。它並不排除議案,但相對不太可能。 – 2009-11-15 05:30:04

+1

是的,你仍然保證,以前的任何內存仍然會在那裏,謝謝指出 – 2009-11-15 15:19:13

0

在Windows上,C運行時抓起一堆,然後從該堆分配內存。所以操作系統不會知道個別的內存分配,因此不會移動。

+1

這是不正確的。首先,Visual C運行時不直接調用操作系統堆實現。另一方面,HeapReAlloc()調用_does_移動事物。 – 2009-11-15 03:18:21

+1

你需要仔細檢查你的文檔。請參閱: http://msdn.microsoft.com/en-us/library/csd157zx.aspx CRT抓取單個操作系統堆以在內部使用。然後它會分配堆(意味着它不使用Win32堆調用來在該堆中執行分配) – DougN 2009-11-16 14:54:51

6

有沒有保證realloc將返回相同的位置,期間。

+0

如果在某處明確聲明,那將會很不錯。不是說「X保證發生」與具體說明「X不保證發生」不同。 – RoG 2016-12-16 11:58:11

4

realloc不需要離開塊地方,即使它會適合,而實際上最簡單的存根實現是一個例子,其中也可能不:

  • malloc:致電sbrk
  • realloc:致電mallocmemcpy
  • free:no-op。

這聽起來很荒謬,但有時對於嵌入式系統來說,像我剛纔描述的實現實際上是最優的。

+0

另一個例子是一個實現,其中所有相鄰的分配都是相同大小的塊以避免分段。在這種情況下,一個32字節塊不再與前面的4096字節塊位於同一位置。 – 2011-05-11 21:01:49

+0

是的。另一個更高級的例子是一個實現,它檢查要縮放的塊的左側鄰居是否空閒,是否通過收縮在右側創建重要的空閒塊,結果大小是否「足夠小「'memcpy'不是太貴......如果滿足正確的條件,將塊移到新的位置以避免碎片。 – 2011-05-11 22:41:41

2

在我看來,所有當前的答案(在這個答案的時候)並沒有提到任何標準文件。

對於C++,我會參考Working Draft, Standard for Programming Language C++, Document Number: N3337, Date: 2012-01-16, Revises: N3291,根據https://isocpp.org/std/the-standard,它是非免費官方C++ 11標準文檔中最接近的免費文檔;在這裏,我們找到13年6月20日C庫

2的內容是相同的標準C庫頭, 有以下變化:在我看來,上市變化不相關的 題]。

所以現在我們必須參考C標準。

根據https://stackoverflow.com/a/83763/15485與非免費官方C11標準文件最接近的免費文件爲Programming languages — C, N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x;這裏我們找到7.22.3。5 realloc函數

4 realloc函數返回一個指向新的對象(其 可以具有相同的值作爲一個指針,指向舊的對象)或空 指針,如果新對象無法分配。

我不是英語爲母語的人,所以由你來解釋「可能有」的含義。

+4

我是英語母語人士(並且非常熟悉C標準)。帶引號的文字表示新指針可能具有或不具有與舊指針相同的值,並不意味着這取決於大小。一個基本原理(在標準中沒有說明)是一個實現可以在一個不同的位置分配一個較小的塊來減少碎片並使未來的分配更有可能成功。爲保證它在某些情況下不會移動,必須在標準中明確說明。事實並非如此。 – 2014-08-04 19:09:13