函数宏
GLiballoca
声明 [src]
#define g_alloca (
size
)
描述 [src]
在堆栈上分配 size
字节;这些字节会在当前堆栈框架清理时释放。本宏本质上只是包装了大多数 UNIX 变体中提供的 alloca()
函数。因此,它提供了与 alloca() 相同的优点和缺点
-
alloca()
非常快,因为在大多数系统上,它仅通过调整堆栈指针寄存器来实现。 -
在它的作用域内,它不会引起任何内存碎片,单独的
alloca()
块只是建立起来,并在函数结束时一起释放。 -
分配大小必须适合当前堆栈框架。例如,在 Linux 上的多线程环境中,每个线程的堆栈大小限制为 2 兆字节,因此要谨慎使用
alloca()
。 -
由于堆栈空间不足而导致的分配失败不会像 malloc() 一样以
NULL
回报表示。相反,大多数系统可能会用与无限函数递归产生的堆栈空间不足情况相同的方式处理它,即通过段错误。 -
允许 untrusted 方指定
size
将允许他们通过指定一个大尺寸触发分段错误,从而导致拒绝服务漏洞。size
必须始终完全由程序控制。 -
当将
alloca()
与 GNU C 可变大小数组混合使用时,必须特别小心。在与可变大小数组相同的范围内使用alloca()
分配的堆栈空间将随可变大小数组一起在离开该范围时释放,而不是在离开封闭函数范围时释放。
语言绑定不能直接使用此函数。