堆VS栈(Stack & Heap)

乐活   2025-01-31 21:22   内蒙古  

经常出现这个概念,其实是数据结构里面的内容,以及计算机体系结构?我不确定,这篇简单的看看。

好!就这两个了

栈是依赖于一个这样的结构的

栈由 栈指针(SP, Stack Pointer) 维护,执行函数调用时:
  1. 入栈(Push):函数调用时,参数、返回地址、局部变量依次入栈。
  2. 出栈(Pop):函数返回时,释放局部变量,恢复返回地址,弹出栈内容。

比如一个这样的函数栈

里面的局部变量在栈里面

这就是所谓的套娃,因为有着先来后到~

下面就是咱们先运行的main,先把A函数放进来,接着是B。

因为栈也是划出来一块内存,那就有大小,有可能溢出-栈溢出(Stack Overflow)

  1. 递归调用层数过多
  2. 局部变量过大
  3. 调用栈深度超过栈空间

你看这个东西就无穷无尽的,就不要嵌套太深,容易出不来

可以优化一下,减少递归深度(改用循环)。

使用堆存储大数组:

太大的就申请一块内存

但是堆会忘,一块内存申请了以后别人用不了了,所以需要再释放,就是还原。

free一下

这叫悬挂指针

在许多编程语言中(比如C),显示地从内存中删除一个对象或者返回时通过销毁栈帧,并不会改变相关的指针的值。

该指针仍旧指向内存中相同的位置,即使引用已经被删除,现在可能已经挪作他用。

就是释放过了,但是里面还有值,可以覆盖读写,需要清空一下。

这样就合适了

使用 存储小数据(局部变量)。
需要大内存时,使用 并手动管理释放。
避免递归导致栈溢出,避免 malloc() 造成内存泄漏。

再总结一下

云深之无迹
纵是相见,亦如不见,潇湘泪雨,执念何苦。
 最新文章