繁体   English   中英

如果缩小分配的内存大小,还要检查realloc()吗?

[英]Also check realloc() if shrinking allocated size of memory?

当调用realloc() ,应在将返回的指针分配给作为参数传递给函数的指针之前检查函数是否失败...

我一直遵循这个规则。

现在,当您确定内存将被截断且不会增加时,是否有必要遵循此规则?

我从未见过失败。 只是想知道我是否可以保存一些说明。

无论新大小是大还是小, realloc可以自行决定将块复制到新地址。 如果malloc实现需要新分配以“缩小”存储块(例如,如果新大小需要将存储块放置在其他分配池中),则这可能是必要的。 glibc文档中对此进行了说明

在几种分配实现中,有时缩小块有时需要对其进行复制,因此,如果没有其他可用空间,它可能会失败。

因此,即使收缩,也必须始终检查realloc的结果。 由于重新分配无法同时分配一个较小的新块,因此realloc无法缩小该块。

即使您将realloc (请仔细阅读realloc(3)和有关Posix realloc的内容 )的大小减小,其基础实现也等效于malloc (具有较小的新大小),然后执行memcpy (从旧区域到新区域) ,然后从旧区域中free 否则它可能什么也不做...(例如,因为某些粗略的malloc实现保留有限的一组大小-例如2或3的2倍幂,并且新旧大小要求都适合相同的大小...。 )

malloc可能失败。 因此,重新realloc仍然可能失败。

实际上,出于这种原因,我通常不建议使用realloc :只需执行mallocmemcpyfree自己即可。

实际上,像malloc这样的动态堆内存功能很少会失败。 但是,当他们这样做时,如果不处理,可能会发生混乱。 在Linux和其他一些POSIX系统,你可以了setrlimit(2)RLIMIT_AS -例如,使用bash ulimit builtin-降低用于测试目的的限制。

您可能需要研究C内存管理的源代码实现。 例如, MUSL libc (对于Linux)是非常易读的代码。 在Linux上, malloc通常建立在mmap(2)之上 C库可以使用mmap分配很大的内存,然后管理其中较小的已使用和已释放的内存区域)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM