使用alloca时访问冲突

时间:2016-06-13 12:20:41

标签: c++ c malloc alloca

我的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() \
)

3 个答案:

答案 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)

From the man page

  

此临时空间将自动释放          当调用alloca()的函数返回其调用者时。

因此,只要您的stackAlloc函数返回,它就会自动释放内存。

答案 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进行检查)。