alloca()在堆栈上而不是在堆上分配内存,如同的情况一样malloc().所以,当我从例程返回时,内存被释放.所以,实际上这解决了我释放动态分配内存的问题.释放分配的内存malloc()是一个令人头痛的问题,如果不知何故错过会导致各种内存问题.
alloca()尽管有上述特征,为什么不鼓励使用?
在堆栈的末尾,有一个保护页被映射为不可访问的内存——如果程序访问它(因为它试图使用比当前映射更多的堆栈),就会出现访问冲突。
_chkstk() 是一个特殊的编译器辅助函数,它
确保局部变量有足够的空间
即它正在做一些堆栈探测(这是一个LLVM 示例)。
这种情况是特定于 Windows 的。所以Windows有一些解决问题的方法。
让我们考虑 Linux(或其他一些类 Unix)下的类似情况:我们有很多函数的局部变量。第一个堆栈变量访问在堆栈段后面(例如mov eax, [esp-LARGE_NUMBER],这里 esp-LARGE_NUMBER 是堆栈段后面的内容)。是否有任何功能可以防止可能的页面错误或 Linux(可能是其他类 Unix)或开发工具(如gcc、clang等)中的任何功能?-fstack-check(GCC 堆栈检查)是否以某种方式解决了这个问题?这个答案表明它与_chkstk().
PPS 一般来说,问题是关于操作系统(最重要的Linux与 Windows)之间的实现差异,这些方法与大量堆栈变量作斗争,爬到堆栈段后面。添加 C++ 和 C 标记是因为它是关于 Linux 本地二进制生成的,但汇编代码与编译器相关。