簡體   English   中英

如果縮小分配的內存大小,還要檢查realloc()嗎?

[英]Also check realloc() if shrinking allocated size of memory?

當調用realloc() ,應在將返回的指針分配給作為參數傳遞給函數的指針之前檢查函數是否失敗...

我一直遵循這個規則。

現在,當您確定內存將被截斷且不會增加時,是否有必要遵循此規則?

我從未見過失敗。 只是想知道我是否可以保存一些說明。

無論新大小是大還是小, realloc可以自行決定將塊復制到新地址。 如果malloc實現需要新分配以“縮小”存儲塊(例如,如果新大小需要將存儲塊放置在其他分配池中),則這可能是必要的。 glibc文檔中對此進行了說明

在幾種分配實現中,有時縮小塊有時需要對其進行復制,因此,如果沒有其他可用空間,它可能會失敗。

因此,即使收縮,也必須始終檢查realloc的結果。 由於重新分配無法同時分配一個較小的新塊,因此realloc無法縮小該塊。

即使您將realloc (請仔細閱讀realloc(3)和有關Posix realloc的內容 )的大小減小,其基礎實現也等效於malloc (具有較小的新大小),然后執行memcpy (從舊區域到新區域) ,然后從舊區域中free 否則它可能什么也不做...(例如,因為某些粗略的malloc實現保留有限的一組大小-例如2或3的2倍冪,並且新舊大小要求都適合相同的大小...。 )

malloc可能失敗。 因此,重新realloc仍然可能失敗。

實際上,出於這種原因,我通常不建議使用realloc :只需執行mallocmemcpyfree自己即可。

實際上,像malloc這樣的動態堆內存功能很少會失敗。 但是,當他們這樣做時,如果不處理,可能會發生混亂。 在Linux和其他一些POSIX系統,你可以了setrlimit(2)RLIMIT_AS -例如,使用bash ulimit builtin-降低用於測試目的的限制。

您可能需要研究C內存管理的源代碼實現。 例如, MUSL libc (對於Linux)是非常易讀的代碼。 在Linux上, malloc通常建立在mmap(2)之上 C庫可以使用mmap分配很大的內存,然后管理其中較小的已使用和已釋放的內存區域)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM