使用 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() 
)

假设您在 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 执行检查)。

相关内容

  • 没有找到相关文章