什么是“悬挂参考”& “一般性保护错误”?

时间:2013-04-18 10:15:23

标签: c memory memory-leaks

当我研究一些与内存泄漏相关的东西时,我偶然发现了这个问题。

int* Function()

{

   int arrays[10];

     /* Some code here */

   return &(arrays[0]);

}

作者说上面的代码是有效的,但是返回的内存将被你调用的下一个函数重用,因此相同的内存将用于两个目的。这被称为“悬挂参考”,可能导致可怕的间歇性故障,或者是一种老式的“一般保护故障”。

如果有人可以解释什么是“悬挂参考”和& “一般保护错误”

3 个答案:

答案 0 :(得分:3)

这并不会完全泄漏内存,因为当函数返回时,已分配的数组将自动释放。这就是挂起引用的含义,您将返回指向堆栈上分配的某些内存的指针。当函数返回时,堆栈已分配的数组被释放,因此内存中的位置可能被下一个函数调用的数据覆盖,因此取消引用返回的指针将给出未定义的值。这很可能会导致一般性保护错误,因为指针的值可能会发生变化,使其指向有效地址空间之外,因此删除指针会导致一般性保护错误。

答案 1 :(得分:2)

我不知道这些是否是官方解释,但我希望它能为这个例子提供更好的意义:

挂起引用:return语句返回数组的引用(指针)。但是,在函数关闭后,(或可以)删除内存,因此存在不指向已分配内存的引用,这称为挂起引用。

这可能导致一般性保护错误。通常,不应写入未分配的内存。如果您尝试这样做,操作系统可能会引发一般性保护错误。

答案 2 :(得分:1)

调用arrays时,在堆栈上分配

FunctionFunction返回堆栈上分配的结构的地址。当Function返回时,堆栈指针会弹回,但其数据仍在堆栈中。 当先前释放的堆栈区域将被另一个函数或作用域使用时,该函数会将其本地作用域数据写入仍可从先前返回的指针访问的堆栈部分。

这有两个后果:

  • 如果您尝试从外部Function访问数组数据,那些数据将不再可靠,并且(或多或少)会被覆盖该堆栈区域的新分配损坏。
  • 在堆栈上分配的新函数,如果没有初始化它的所有字段,可能包含一些脏数据

结果是未定义的行为,也可能依赖于编译器和编译选项。