函数返回局部变量后内存空间的行为如何?

时间:2014-09-24 06:26:36

标签: c memory-leaks

void local () {
    int x = 100;

    double *loc;
    loc = (double *) malloc(sizeof(double)*100);
    memset(rxnrun, 0x0, sizeof(double)*100);

    // perform some operations


    // free(loc);
    return; // without doing free for loc variable
}

在这里,我可以看到有什么问题,因为loc变量存在内存泄漏。但是,变量x呢?如果我们在函数返回后保留变量x以及loc变量无人值守(非自由),那么两个变量获取的内存空间会发生什么?

他们(两个变量)是否仍会获得空间?

3 个答案:

答案 0 :(得分:6)

实际上,xloc变量都是局部函数变量,当函数返回时,两个变量都被释放

但是,loc是指针,指针指向的内存是未释放的内容。它只是由malloc()分配的未释放的内存。

答案 1 :(得分:3)

所有C实现都使用call stack。因此局部变量在该堆栈上(或在寄存器中)并在被调用函数返回时消失。

理论上,C不需要任何调用堆栈。实际上,所有C实现都使用一个。

实际上,当块(在大括号之间)声明它被退出时,局部变量会丢失(因此消失)。实际上,调用帧上的插槽可以重用,或者变量位于寄存器中,该寄存器通常用于其他方式。

在C中编码时,您应该认为每个局部变量在退出块时都会消失。编译器可以随意实现该抽象(通常使用调用堆栈,或将该变量保存在某个寄存器或稍后将重用的其他区域中。)

请注意,在您的示例中,xloc都是局部变量。但是loc 包含指向堆上内存区域的指针。该区域由free

发布

阅读undefined behavior,例如

// WRONG CODE!
int* p = 0;
{ 
   int y = 23;
   p = &y;
};
int z = *p; // undefined behavior

这里y是大括号中块的局部变量。您将其地址存储在p中。当您取消引用该地址以将其内容放入z时,您有未定义的行为实现可以执行anything(包括摧毁Universe,或者爆炸你的计算机)并且仍然符合C的规范。

在不了解具体实施和环境的情况下,实际发生的事情是不可预测的。实际上,这对你不利,上面的代码甚至可能都没有“错误”,而且可以将某些内容存储在z中。

答案 2 :(得分:-1)

变量x和loc将被遗忘,但malloc分配的内存将被占用,但将忘记指向此内存的指针。

没有什么好事来。