首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用alloca时的访问冲突

使用alloca时的访问冲突
EN

Stack Overflow用户
提问于 2016-06-13 12:20:41
回答 3查看 244关注 0票数 6

我的stackAlloc函数如下所示:

代码语言:javascript
复制
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,一切都可以工作。

我将函数更改为宏,现在它按预期工作:

代码语言:javascript
复制
#define maxStackAllocation 1024
#define stackAlloc(size) \
( \
    (size > maxStackAllocation)? \
         malloc(size): \
        _alloca(size) \
)

#define stackAllocFree(ptr, size) \
( \
    (size > maxStackAllocation)? \
        free(ptr): \
    void() \
)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-13 12:27:11

假设您在Windows上运行,因为您的代码调用了_alloca(),根据MSDN文档

_alloca从程序堆栈分配大小字节。当调用函数退出时,分配的空间将自动释放。

注意,当调用函数退出时,内存将被释放--我假设这也意味着调用函数返回。

你的代码:

代码语言:javascript
复制
void* stackAlloc(size_t size) {
    if (size > maxStackAllocation)
        return malloc(size);
    else 
        return _alloca(size);
}

返回,从而释放通过_alloca()获得的内存。

票数 9
EN

Stack Overflow用户

发布于 2016-06-13 12:27:17

从手册页

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

因此,每当您的stackAlloc函数返回时,它将自动释放内存。

票数 3
EN

Stack Overflow用户

发布于 2016-06-13 20:41:09

这是可行的,但我建议不要在生产中使用它:

代码语言:javascript
复制
#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进行检查)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37789732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档