我的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() \
)
答案 0 :(得分:9)
假设您已在Windows上运行,因为您的代码调用_alloca()
,符合MSDN documentation:
_alloca 从程序堆栈中分配 size 字节。当调用函数退出时,自动释放分配的空间
请注意,当调用函数退出时,内存将被释放 - 我假设这也意味着调用函数返回。
您的代码:
void* stackAlloc(size_t size) {
if (size > maxStackAllocation)
return malloc(size);
else
return _alloca(size);
}
返回,从而释放通过_alloca()
获得的内存。
答案 1 :(得分:3)
答案 2 :(得分:0)
这有效,但我建议不要在生产中使用它:
#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] = '\0';
return 0;
}
反查:如果我减少stackAlloc的参数,它就不起作用(这是预期的行为) 随意在stackAlloc中添加支票等(通过返回不同的lambdas或让lambda进行检查)。