当前位置: 首页 > news >正文

避免分配大小为零的内存空间

当申请分配的内存空间大小为 0 时,malloc、calloc、realloc 等函数的行为是由实现定义的。

示例: 

void foo(size_t n) {int* p = (int*)malloc(n * sizeof(int));if (p == NULL)log("Required too much memory");   // ‘n’ may also be zeroelse....
}

当例中 n 为 0 时,malloc 可能会分配元素个数为 0 的数组,也可能会返回空指针。

又如:

char* bar(size_t n) {char* p = (char*)malloc(n * sizeof(char));   // ‘n’ may be zeroif (p != NULL) {p[0] = '\0';   // May overflow}return p;
}

注意,如果 malloc 的返回值不为空,并不能保证其分配的数组大小是合理的,也可能为 0,如果不加判断就数组进行操作,会导致缓冲区溢出等问题。

这种情况下 C++ 语言的 new 运算符会分配元素个数为 0 的数组,但这种数组往往没有实际价值,而且要注意,在 C 和 C++ 语言中元素个数为 0 的数组均需要被释放。

又如:

int* p = (int*)malloc(n * sizeof(int));
....
realloc(p, 0);   // Non-compliant, use free(p) instead

C90 规定当 realloc 函数的长度参数为 0 时会释放内存,与 free(p) 相同,但在后续标准中废弃了这一特性,不应继续使用。

参考资料:https://saferules.github.io/#resource


http://www.mrgr.cn/news/48467.html

相关文章:

  • 详细介绍AUTOSAR APPL应用层-part6(SWC内部介绍)
  • STL之set、map的使用
  • Spring Boot在医疗B2B平台中的病历数据安全
  • 单片机XMEGA系列芯片dieshot赏析​
  • DAY8 Final等
  • DDR Study - Basic Understanding
  • 一个月学会Java 第12天 剖析static关键字与普通代码块和静态代码块还有final关键字
  • 基于STM32的车牌识别系统
  • 【React】React18核心源码解读
  • 什么电容笔好用?2024双11盘点入手不亏的五大宝藏平替电容笔 !
  • 第十四章 RabbitMQ延迟消息之延迟队列
  • 详细学习 pandas 和 xlrd:从零开始
  • 实测9款AI文件助手!原来最好用的并不是全网称赞的谷歌NotebookLM...
  • 京准:时间频率(北斗授时设备)助力广电网络
  • Unity的Compute Shader如何进行同步?
  • JVS低代码轻应用是什么?是如何拼装的?这篇文章讲的非常详细
  • Docker 教程一(简介)
  • NVM 切换Node.js版本工具
  • 家政行业怎么运营
  • 【从零开始的LeetCode-算法】3158.求出出现两次数字的 XOR 值