正確使用 realloc()

衆所周知,realloc() 的做用就是將已經 malloc 的內存塊,從新擴展加長。當你並無使用高端的內存池的時候,臨時從堆中申請加大內存,這是頗有用的。可是如何正確地使用 realloc() 呢?html

Reference

realloc 用法程序員

調用方法

函數原型

#include <stdlib.h>

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

傳入參數:
(1)須要被擴展大小的內存指針
(2)擴展後的大小(注意不是添加的大小)函數

返回參數:
  新的指針ui


正確的調用方式

長篇大論放後面,咱們先上代碼:spa

uint8_t *pMemToBeRealloc = malloc(1024);
size_t memSize = 1024;
...

/* start realloc */
uint8_t *pMemBackup = pMemToBeRealloc;    /* 將 realloc 以前的內存地址備份一下 */
pMemToBeRealloc = realloc(pMemToBeRealloc, 2048);

if (pMemToBeRealloc) {                    /* realloc 成功 */
    LOG_DEBUG("Memory had been extent to 2048.");
    pMemBackup = NULL;
    memSize = 2048;
}
else {                                    /* realloc 失敗了,這個時候返回的是 NULL */
    LOG_ERROR("Oh no, realloc() failed: %s.", strerror(errno));
    pMemToBeRealloc = pMemBackup;
    memSize = 1024;
}

...

原理

realloc() 返回 NULL 的時候,表示內存擴展動做失敗了。但這個時候,原來的內存並無被釋放,因此有必要把原來的內存預先備份下來。至於失敗的時候要怎麼處理,那就是程序員本身的事情了,這沒有標準方案。指針

realloc() 返回非零值時呢,表示realloc是成功的。此時不論返回值是多少,程序都不須要對原來的內存地址值做特殊操做code

爲何這麼說呢?主要是參考資料裏面沒有把一個問題說清楚:htm

  1. 首先,若是 pMemToBeRealloc == pMemBackup的狀況,那說明只是在原來的內存基礎上日後擴展就行了,這是最簡單的狀況
  2. 但是若是 pMemToBeRealloc != pMemBackup 呢?這很容易讓人誤解爲,須要調用一次 free(pMemBackup)。這是錯誤的,由於這個動做,realloc 會自動幫你作了,不要多此一舉!

BTW,我的還建議注意一個地方:從 man 手冊上面看,雖然對於 malloc() 返回的內存,大部分標準庫會初始化爲全零,可是對於 realloc() 擴展的部分,則不必定。
不過保險起見,應該是對於 malloc() 和 realloc() 返回的內存內容,都不要相信它們都已經被初始化爲0纔好。blog

相關文章
相關標籤/搜索