使用alloca分配的内存会在函数结束或作用域结束时释放吗?

12

如果我有这样一个函数:

void bla(int size) {
    while(b){
        char tmp[size];
        ......
    }
}

tmp在while循环的每次迭代中都会被释放,对吗?

如果我写下这个函数:

void bla(int size) {
    while(b){
        char* tmp = alloca(size);
        ......
    }
}

tmp在作用域结束时还是在函数结束时被释放?

3个回答

10

该变量将在函数结束时被释放,但由于您在循环中调用了alloca(),因此可能会出现堆栈溢出。如果size在函数内部没有改变,则应在循环之前调用alloca()


使用VLA代替alloca。实际上,这是VLA和alloca之间的主要区别 - 自动数组的作用域为块作用域,而alloca的作用域为函数作用域。 - R.. GitHub STOP HELPING ICE

3

alloca 在堆栈上分配内存,并且没有关于作用域的知识,所以在离开堆栈帧(即退出函数后)之后会被释放。


3

alloca()函数分配的内存会在函数退出时被释放。如果需要更多信息,可以参考手册页面

对于前一种情况,即在作用域中只有一个自动变量,我不确定如何定义它何时被“释放”。您无法在定义它的作用域之外引用它,如果它有一个初始化器,则会在每次迭代中重新初始化。


1
它在非常精确的意义上被释放。标准区分变量的作用域和生命周期。对于VLA,它确保其生命周期的结束与其作用域的执行结束相同。因此,它占用的内存被有效地释放。大小表达式在每次迭代中计算,生命周期也仅从那时开始。顺便说一下,VLA不允许有初始化器。 - Jens Gustedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接