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
变量无人值守(非自由),那么两个变量获取的内存空间会发生什么?
他们(两个变量)是否仍会获得空间?
答案 0 :(得分:6)
实际上,x
和loc
变量都是局部函数变量,当函数返回时,两个变量都被释放。
但是,loc
是指针,指针指向的内存是未释放的内容。它只是由malloc()
分配的未释放的内存。
答案 1 :(得分:3)
所有C实现都使用call stack。因此局部变量在该堆栈上(或在寄存器中)并在被调用函数返回时消失。
理论上,C不需要任何调用堆栈。实际上,所有C实现都使用一个。
实际上,当块(在大括号之间)声明它被退出时,局部变量会丢失(因此消失)。实际上,调用帧上的插槽可以重用,或者变量位于寄存器中,该寄存器通常用于其他方式。
在C中编码时,您应该认为每个局部变量在退出块时都会消失。编译器可以随意实现该抽象(通常使用调用堆栈,或将该变量保存在某个寄存器或稍后将重用的其他区域中。)
请注意,在您的示例中,x
和loc
都是局部变量。但是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分配的内存将被占用,但将忘记指向此内存的指针。
没有什么好事来。