避免分配大小为零的内存空间
2.23 ID_zeroLengthAllocation
当申请分配的内存空间大小为 0 时,malloc、calloc、realloc 等函数的行为是由实现定义的。
示例:
int n = user_input();
if (n >= 0) {
int* p = (int*)malloc(n * sizeof(int)); // Non-compliant
if (p == NULL)
log("Required too much memory"); // ‘n’ may also be zero
else
....
}
当例中 n 为 0 时,malloc 可能会分配元素个数为 0 的数组,也可能会返回空指针。
又如:
int* p = (int*)malloc(n * sizeof(int));
....
realloc(p, 0); // Non-compliant, use free(p) instead
C90 规定当 realloc 函数的长度参数为 0 时会释放内存,与 free(p) 相同,但在后续标准中废弃了这一特性,不应继续使用。
这种情况下 C++ 语言的 new 运算符会分配元素个数为 0 的数组,但这种数组往往没有实际价值,而且要注意,在 C 和 C++ 语言中元素个数为 0 的数组也需要被释放。
依据
ISO/IEC 9899:1990 7.10.3.4
ISO/IEC 9899:1999 7.20.3(1)-implementation
ISO/IEC 9899:2011 7.22.3(1)-implementation
ISO/IEC 14882:2003 5.3.4(7)
ISO/IEC 14882:2011 5.3.4(7)