正确使用 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

相关文章
相关标签/搜索