如果正在缩小已分配的内存大小,请同时检查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
实现可能具有一组有限的大小,如二次幂或三倍二次幂,并且旧的和新的大小要求适合相同的大小……)
malloc
可能会失败。所以realloc
仍然可能失败。
实际上,出于这个原因,我通常不建议使用realloc
:只需自己做malloc
、memcpy
、free
即可。
事实上,像malloc
这样的动态堆内存函数很少失败。但当他们这样做的时候,如果你不处理,混乱可能会发生。在Linux和其他一些Posix系统上,您可以使用RLIMIT_AS
设置rlimit(2),例如使用内置的bashulimit
,以降低测试限制。
您可能想要研究C内存管理的源代码实现。例如,MUSLibc(用于Linux)是可读性很强的代码。在Linux上,malloc
通常构建在mmap(2)之上(C库可以使用mmap
分配一大块内存,然后管理其中较小的已使用和释放的内存区域)。
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 清除前检查矢量
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- C++LDAP检查用户是否是特定组的成员
- 检查TCHAR数组输入是否为带符号整数C++
- 如果正在缩小已分配的内存大小,请同时检查realloc()