技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 509|回复: 0
收起左侧

【C】有关realloc的细节

[复制链接]

993

主题

2190

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
197
威望
261 点
宅币
16161 个
贡献
31411 次
宅之契约
0 份
在线时间
1543 小时
注册时间
2014-1-26
发表于 2017-1-5 05:19:41 来自手机 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
通常情况下一个动态改变大小的缓冲区在需要增长大小的时候,开发者们会调用realloc,然后用新的变量去接收它返回的指针,判断是否运行失败,确保它真的交出了一块尺寸足够的缓冲区后才把新的指针存储起来。

但如果你是用realloc缩小一块缓冲区的大小呢,它是不是一定会成功?理论上这应该是一个N全其美的事情,因为许多开发者会对它有着这样的幻想:
1、它只是缩小缓冲区,所以它应该只是把缓冲区后面不要的部分标记为“空闲内存”,理论上可以省掉一个memcpy的操作吧。。。
2、既然是缩小缓冲区,它不可能运行失败吧,内存不够用导致它返回NULL 我能理解。但缩小缓冲区不会造成内存不够用的吧?毕竟我是指望让它把内存释放掉的。
3、如果我的缓冲区足够小,是不是它就能自动帮我把我那块缓冲区移动到更靠前的两片内存碎片之间呢?

但事实上根据我的使用经验来看,realloc并没有那么强。即便你觉得用realloc缩小你分配的内存的大小,它也可能返回NULL并且造成失败(取决于平台)。多数人想当然地认为用realloc的时候,它能既释放掉末尾部分的内存,又能减少移动数据的操作。然而:realloc只是个能增长你分配的内存的大小的函数而已,它存在,但在不同的平台,它的实现千差万别。有的平台甚至是先malloc一个新的,然后memcpy复制保留的数据,再free旧的,即使你做的是缩小的操作!即便如此,你可能觉得它malloc要是失败了,它可以什么也不做,把旧缓冲区返回给你,但事实上有的平台它确实就是返回一个NULL给你!
因此无论如何,调用realloc都应该检查它是不是真的成功调整了缓冲区,即便是缩小。
还有,realloc(xxx,0)在有些平台并不会释放xxx,而是会尝试分配一个大小为0的缓冲区给你,把realloc(xxx,0)当free用,会造成内存泄露。

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2018-7-18 14:56 , Processed in 0.095923 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表