malloc分配失败的两个现象

本文探讨了在程序运行过程中,malloc函数在某些情况下即使之前成功分配并释放了内存,在相同位置再次调用时仍可能出现内存分配失败的现象。文章还提到了同一函数内后续malloc调用可能失败,但在该函数执行完毕后,其他函数的malloc调用却能成功的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际代码中,malloc的反复分配释放,可能会导致某一次malloc分配失败,虽然上一次调用malloc分配成功(然后释放),下一次在相同地方调用malloc分配可能会失败,疑问在于,既然上一次分配成功(然后释放),那么总的分配量并没有增加,为何下一次分配会失败。以下图为例,这个函数会被循环调用,但是在第2次,或者第3次的时候,第二个分配会失败。同时存在第二个问题,同一个函数后续的malloc也会失败,但是这个当这个函数执行完成,其他函数的malloc是成功的,所以问题很奇怪。本次只能记录现象,但是对问题的本质依然不明白。

转载于:https://www.cnblogs.com/429512065qhq/p/8607991.html

### malloc 返回 nullptr 的原因 `malloc` 是一种动态内存分配函数,用于请求指定大小的连续存储空间。然而,在某些情况下,它可能无法成功完成这一任务,并因此返回 `nullptr` 值。以下是可能导致这种情况的主要因素: 1. **系统资源耗尽** 如果系统的可用物理内存或虚拟地址空间不足以满足所请求的内存大小,则 `malloc` 将返回 `nullptr`。这是最常见的原因之一[^1]。 2. **非法参数输入** 调用 `malloc` 时传入了负数或者超出合理范围的大数值作为所需字节数量,也会触发错误行为并最终导致返回 `nullptr`[^1]。 3. **堆损坏** 在程序运行期间如果发生了越界写入或者其他形式的堆破坏活动,后续再次尝试调用 `malloc` 可能会因为内部状态混乱而失败,表现为返回 `nullptr`[^1]。 4. **线程竞争条件** 多线程环境下如果没有妥善管理共享资源访问顺序,可能发生两个及以上线程同时争夺相同数量级的小块剩余自由区域的情况,从而造成其中一个或多于一个线程收到 `nullptr` 结果[^1]。 对于上述提到的各种情况不仅仅局限于单独讨论的 `malloc`, 还适用于其他相似作用域内的函数比如 `calloc`, `realloc` 等等, 它们都具备同样的可能性即当遭遇极端状况之时给出指示失败的结果——也就是返回值为零(`0`) 或者说空指针 (`nullptr`) 表达式. --- ### 解决 CMake 中 stamp mismatch with notes file 问题的方法 在使用 GCC 工具链进行软件开发的过程中,尤其是涉及到覆盖率测量的时候,有时会碰到类似于 “stamp mismatch with notes file” 的提示信息。这类现象往往源于以下几个方面的原因及其相应的解决方案如下所示: 1. **清除旧有构建产物** 每次重新编译项目之前都应该彻底擦除先前留下来的中间件成果物特别是那些由 GCOV 所产生的辅助文档如 `.gcda` 和`.gcno` 文件。如果不这样做的话就很容易出现时间标记不符之类的问题。可以通过命令行执行下面的操作来达到目的: ```bash make clean || rm -rf ./CMakeFiles/*/*.gc* ``` 2. **统一构建配置** 确认当前的工作副本只采用了一致性的设定来进行每一次迭代式的组装作业流程。也就是说要么全程都维持 DEBUG 模态要么坚持 RELEASE 方式绝不可混杂两者之间来回切换以免带来不必要的麻烦。具体做法是在顶层目录下的 `CMakeCache.txt` 文件里查找类似这样的条目:`CMAKE_BUILD_TYPE=Debug|Release` 并依据实际需求调整成固定的状态后再继续往下走下一步骤。 3. **更新工具版本** 使用最新稳定版的相关组件能够有效减少此类低层次的技术障碍发生几率。所以建议定期检查官方仓库获取升级包安装上去替换掉老旧型号的产品实例。例如针对 Linux 发行板而言可通过APT-get途径轻松搞定此事务: ```bash sudo apt update && sudo apt install gcc g++ cmake --only-upgrade ``` 通过采取以上措施基本上就可以规避大部分常规场景下关于 "stamp mismatch" 类型报错事件的发生频率进而提升整体工作效率水平。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值