9

当我在研究一些与内存泄漏相关的东西时,我在网上遇到了这个问题。

int* Function()

{

   int arrays[10];

     /* Some code here */

   return &(arrays[0]);

}

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

如果有人能解释什么是“悬挂参考”和“一般保护故障”,那就太好了

4

3 回答 3

3

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

于 2013-04-18T10:31:59.073 回答
2

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

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

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

于 2013-04-18T10:27:03.120 回答
2

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

这有两个后果:

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

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

于 2013-04-18T10:27:26.317 回答