2011-03-23 93 views
8

如果我有这样的功能:分配alloca的内存在函数结束或范围结束时被释放?

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

TMP得到的,而每次循环中解脱出来,对不对?

如果我写这个函数:

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

TMP得到在范围年底或功能结束中解脱出来?

回答

7

它将在函数结束被释放,但因为你叫alloca()内环路,你可能会得到堆栈溢出。如果size没有在函数内改变你应该在循环之前调用alloca()

+0

或者使用VLA而不是'alloca'。实际上,这是VLA和'alloca'之间的主要区别 - 自动数组的范围是VLA的块范围和''alloca'的函数范围。 – 2011-03-23 18:13:46

4

alloca分配堆栈上和不具有关于范围的知识,所以它被留在堆栈帧之后释放(=离开功能之后)。与alloca()分配

2

内存被释放函数退出的时候。有关更多信息,请参阅manual page

对于前一种情况,在范围只是一个自变量的,我不知道你将如何定义,这被“释放”。你不能在定义它的范围之外引用它,如果它有一个初始化器,它将在每次迭代时重新初始化。

+0

它得到非常精确的感觉中解脱出来。该标准区分了变量的范围和生命周期。对于VLA,它确保其生命周期的结束与其范围执行的结束相同。所以它占用的内存被有效释放。大小表达式是在每次迭代时计算的,并且生命周期仅在那时开始。 BTW,VLA不允许有初始化程序。 – 2011-03-23 19:29:58

相关问题