realloc的使用誤區

2021-08-31 18:49:18 字數 1311 閱讀 9488

c語言 realloc() 函式位於 stdlib.h 標頭檔案中,原型為:

void *realloc(void *ptr, size_t size);

realloc() 會將 ptr 所指向的記憶體塊的大小修改為 size,並將新的記憶體指標返回。

設之前記憶體塊的大小為 n,如果 size < n,那麼擷取的內容不會發生變化,如果 size > n,那麼新分配的記憶體不會被初始化。

如果 ptr = null,那麼相當於呼叫 malloc(size);如果 size = 0,那麼相當於呼叫 free(ptr)。

如果 ptr 不為 null,那麼他肯定是由之前的記憶體分配函式返回的,例如 malloc()、calloc()或realloc()。

如果 ptr 所指的記憶體塊被移動,那麼會呼叫 free(ptr)。

乙個簡單的 realloc() 卻賦予了好幾個功能,這並不是良好的函式設計。估計也是為了相容性,才容忍這個函式一直在c庫中。雖然在編碼中,realloc() 會提供一定的方便,但是也很容易引發bug。下面是兩個常見bug用法:

第1種行為引發的bug

void *ptr = realloc(ptr, new_size);

if (!ptr) 

這裡就引出了乙個記憶體洩露的問題,當realloc() 分配失敗的時候,會返回null。但是引數中的 ptr 的記憶體是沒有被釋放的。如果直接將realloc()的返回值賦給ptr。那麼當申請記憶體失敗時,就會造成ptr原來指向的記憶體丟失,造成記憶體游離和洩露。

正確的處理應該是這樣:

void *new_ptr = realloc(ptr, new_size);

if (!new_ptr) 

ptr = new_ptr

第2種行為引發的bug

實際上,malloc(0)是合法的語句,會返還乙個合法的指標,且該指標可以通過free去釋放。這就造成了很多人對realloc()的錯誤理解,認為當size為0時,實際上realloc()也會返回乙個合法的指標,後面依然需要使用free去釋放該記憶體。

void *new_ptr = realloc(old_ptr, new_size);

//其它**

free(new_ptr);

由於錯誤的認識,不去檢驗new_size是否為0,還是按照new_size不為0的邏輯處理,最後並free(new_ptr)。這裡就引入了double free的問題,造成程式崩潰。

所以,realloc() 這個設計並不怎麼優良的函式陷阱還是不少的,一不小心就踩雷了,上面只是兩個簡單的小例子,大家在實際使用的時候還應該注意一些其他小問題。

realloc的使用誤區

c語言 realloc 函式位於 stdlib.h 標頭檔案中,原型為 void realloc void ptr,size t size realloc 會將 ptr 所指向的記憶體塊的大小修改為 size,並將新的記憶體指標返回。設之前記憶體塊的大小為 n,如果 size n,那麼擷取的內容不會...

realloc函 realloc函式使用規則

realloc函式使用規則如下 1 realloc失敗的時候,返回null 2 realloc失敗的時候,原來的記憶體不改變,不會釋放也不會移動 3 假如原來的記憶體後面還有足夠多剩餘記憶體的話,realloc的記憶體 原來的記憶體 剩餘記憶體,realloc還是返回原來記憶體的位址 假如原來的記憶...

realloc函式的使用

原型 extern void realloc void mem address,unsigned int newsize 用法 include 有些編譯器需要 include 功能 改變mem address所指記憶體區域的大小為newsize長度。說明 如果重新分配成功則返回指向被分配記憶體的指標...