realloc使用误区

realloc函数用来重新分配一段内存区域,使用它需要包含头文件<stdlib.h>。其函数原型为:

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

其中参数ptr是旧内存区域的地址,size是需要的新的内存区域的大小(size可以比旧内存区域大或小)。
分配时,首先判断ptr指向的区域是否有足够的空间,如果有,则增大(或减少)该内存区域,然后将ptr返回;如果ptr指向的区域没有足够的空间,则分配一段新的内存区域,并且将原ptr的数据拷贝到新的内存区域,释放ptr指向的内存区域(内部完成,不需要外部使用free),返回新的内存区域的地址。

如果 ptr = NULL,那么相当于调用 malloc(size);如果 size = 0,那么相当于调用 free(ptr)。
如果 ptr 不为 NULL,那么他肯定是由之前的内存分配函数返回的,例如 malloc()、calloc()或realloc()。

使用realloc需要比较小心,不然较容易引入bug。

误区一

如果分配空间失败,realloc会返回NULL,但此时ptr指向的旧内存区域是没有释放的,需要我们调用free进行释放。因此我们在使用realloc的时候,不能直接将返回值赋值给ptr。正确的处理如下:

void *new_ptr = realloc(ptr, size);
if (!new_ptr) {
    //错误处理,如free(ptr)等
}

误区二

实际上,malloc(0)是合法的语句,会返还一个合法的指针,且该指针可以通过free去释放。这就造成了很多人对realloc()的错误理解,认为当size为0时,实际上realloc()也会返回一个合法的指针,后面依然需要使用free去释放该内存。比如

void *new_ptr = realloc(ptr, size);
if (!new_ptr) {
    free(ptr);
    return;
}
free(new_ptr);
return;

由于错误的认识,不去检验size是否为0,还是按照size不为0的逻辑处理,最后并free(new_ptr)或free(ptr)。这里就引入了double free的问题,造成程序崩溃。(实际调试的时候,如果size为0,那么返回的new_ptr为NULL)
实际上,传入的参数ptr为NULL或size为0都没有存在的必要,完全可以使用malloc或free来替代,这样,即可以避免踩到坑,也能给后续维护代码的人带来便利,方便理解。所以,使用realloc前,最好检查ptr以及size的值。
参考文档:https://www.cnblogs.com/zhaoyl/p/3954232.html

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值