我的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() \
)发布于 2016-06-13 12:27:11
假设您在Windows上运行,因为您的代码调用了_alloca(),根据MSDN文档
_alloca从程序堆栈分配大小字节。当调用函数退出时,分配的空间将自动释放。
注意,当调用函数退出时,内存将被释放--我假设这也意味着调用函数返回。
你的代码:
void* stackAlloc(size_t size) {
if (size > maxStackAllocation)
return malloc(size);
else
return _alloca(size);
}返回,从而释放通过_alloca()获得的内存。
发布于 2016-06-13 12:27:17
从手册页,
当调用alloca()的函数返回其调用者时,这个临时空间将自动释放。
因此,每当您的stackAlloc函数返回时,它将自动释放内存。
发布于 2016-06-13 20:41:09
这是可行的,但我建议不要在生产中使用它:
#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进行检查)。
https://stackoverflow.com/questions/37789732
复制相似问题