【问题标题】:Memory collision in Stacks堆栈中的内存冲突
【发布时间】:2013-05-26 03:40:00
【问题描述】:

所以我明白什么是堆栈溢出,当内存发生冲突时(以及本网站的标题),但我不明白为什么堆栈的新条目位于递减的内存地址中。为什么它们不在随机内存地址中,这不是更有意义,因此内存冲突不是问题吗?我猜这背后有某种优化原因?

** 编辑 **

我没有意识到的是堆栈被赋予了 x 数量的地址空间。现在有道理,但让我想到了一个后续问题。我可以明确说明我想为堆栈分配多少内存吗?

【问题讨论】:

标签: memory stack overflow stack-overflow


【解决方案1】:

堆栈溢出是指您已用完所有可用的堆栈空间。在大多数情况下,堆栈的可用空间只是系统设计人员选择的任意限制。可以改变这一点,但在现代系统上,这并不是一个真正的问题 - 需要几兆字节堆栈的代码,除非系统非常庞大,否则可能设计不正确。

堆栈从“自定义”向零增长 - 它必须朝着定义的方向前进,否则将很难跟踪正在发生的事情,并且较低的地址与较高的地址一样好。曾经是堆栈和堆相互向对方增长,这将允许使用大量堆栈而不是太多堆的代码在相同数量的内存中工作,就像使用较少量堆栈和大量内存的代码一样。堆。但是现在,通常有足够的内存(空间),可以将堆定义为与堆栈完全分离的某个地方。相反,堆栈溢出是通过在堆栈顶部有一个不可用的“保留”内存区域来检测的 - 因此操作系统会获得一个“陷阱”来使用不可用的内存,并且可以杀死应用程序.

【讨论】:

    【解决方案2】:

    “内存冲突”更适合“缓冲区溢出”一词,即您在预定空间之外写入,但它可能位于不同的分配内存块内。

    堆栈溢出不是将一个内存分配之外的内容写入另一个内存分配。这只是关于在堆栈内存分配之外进行写入。很可能在堆栈之外有一个保护内存页面,它没有分配给任何东西,并导致读取或写入尝试出错。

    并且为压入堆栈的每个值分配一个随机地址使得很难在堆栈上找到数据(并且它不再是堆栈)。当编译器或程序员知道后续元素占用后续地址时,就很容易仅从堆栈帧的基指针计算这些地址。

    【讨论】:

    • 这是有道理的,我没有意识到它在编译时分配了 x 量的内存。但是有没有办法明确说明要分配多少内存?
    • 不,它是在运行时分配的,你可以这样做stackoverflow.com/a/2279084/111160
    • 但是使用正确设计和编码的程序不太可能发生堆栈溢出,它大部分时间是由错误引起的
    • 谢谢 :) 非常感谢。
    【解决方案3】:

    这个问题的答案可能很复杂,但基本上堆栈操作被认为是处理器在正常执行代码时执行的非常原始的功能。 (保存退货地址和其他东西。)

    那么你把内存管理代码放在哪里呢?您在哪里跟踪分配的地址或添加代码以分配新地址?真的没有任何地方可以这样做,因为这些是处理器本身执行的基本操作。

    类似于保存代码本身的内存,假设堆栈是在代码运行之前设置的(并由堆栈寄存器指向)。确实没有任何地方可以向堆栈内存添加复杂的内存管理。所以,是的,如果没有提供足够的内存,堆栈就会溢出。

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2011-02-16
      • 2011-08-01
      • 2021-11-28
      • 2015-10-16
      相关资源
      最近更新 更多