避免使用在栈上动态分配内存的函数
2.20 ID_stackAllocation
alloca、strdupa 等函数可以在栈上动态分配内存,但分配失败时难以通过标准方法控制程序的行为。
在栈上动态分配内存的函数可能效率更高,分配的内存也不用显式回收,但无法满足分配需求时会直接导致运行时错误,对其返回值的检查是无效的。应避免使用这种后果难以控制的函数,尤其在循环和递归调用过程中更不应使用这种函数,而且这种函数不是标准函数,依赖平台和编译器的具体实现。
示例:
#include <alloca.h> // Or use malloc.h in MSVC
void fun(size_t n) {
int* p = (int*)alloca(n * sizeof(int)); // Non-compliant
if (!p) {
return; // Invalid
}
....
}
例中 alloca 函数在栈上分配内存,如果 n 过大会使程序崩溃。