我的stackAlloc
函数如下所示:
void* stackAlloc(size_t size) {
if (size > maxStackAllocation)
return malloc(size);
else
return _alloca(size);
}
void stackAllocFree(void *ptr, size_t size) {
if (size > maxStackAllocation) {
free(ptr);
}
}
如果我更改,则stackAlloc
函数始终使用malloc
而不是alloca
一切正常。
我将函数更改为宏,现在它按预期工作:
#define maxStackAllocation 1024
#define stackAlloc(size)
(
(size > maxStackAllocation)?
malloc(size):
_alloca(size)
)
#define stackAllocFree(ptr, size)
(
(size > maxStackAllocation)?
free(ptr):
void()
)
假设您在 Windows 上运行,因为您的代码调用 _alloca()
,根据 MSDN 文档:
_alloca从程序堆栈中分配大小字节。当调用函数退出时,分配的空间会自动释放
请注意,当调用函数退出时,内存将被释放 - 我假设这也意味着调用函数返回。
您的代码:
void* stackAlloc(size_t size) {
if (size > maxStackAllocation)
return malloc(size);
else
return _alloca(size);
}
返回,从而释放通过 _alloca()
获得的内存。
从手册页,
此临时空间会自动释放 当调用 alloca() 的函数返回到其调用方时。
因此,每当stackAlloc
函数返回时,它都会自动释放内存。
这有效,但我建议不要在生产中使用它:
#include <iostream>
#include <alloca.h>
auto stackAlloc(const size_t size)
{
return [size](){ return alloca(size); };
}
int main() {
char *ch = (char *)stackAlloc(40000)();
ch[39999] = ' ';
return 0;
}
反检查:如果我减少 stackAlloc 的参数,它不起作用(这是这里的预期行为)随意在 stackAlloc 中添加检查等(通过返回不同的 lambda 或让 lambda 执行检查)。