`

内存堆栈

    博客分类:
  • java
阅读更多
堆栈是一种执行“后进先出”算法的数据结构。

设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。

堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“弹出pop”。如此就实现了后进先出的原则。

堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。
堆栈可以用数组存储,也可以用以后会介绍的链表存储。
下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,栈顶指针减1。
 
堆和栈是两个不同的概念。

简单的来讲堆(heap)上分配的内存,系统不释放,而且是动态分配的。栈(stack)上分配的内存系统会自动释放,它是静态分配的。运行时栈叫堆栈。栈的分配是从内存的高地址向低地址分配的,而堆则相反。

由malloc或new分配的内存都是从heap上分配的内存,从heap上分配的内存必须有程序员自己释放,用free来释放,否则这块内存会一直被占用而得不到释放,就出现了“内存泄露(Memory Leak)”。这样会造成系统的可分配内存的越来越少,导致系统崩溃。

题外:很多人认为在程序中尽量使用堆而不使用栈,因为堆栈溢出很危险。其实堆溢出比栈溢出更危险。哈哈~!
分享到:
评论

相关推荐

    内存堆栈分析工具MAT 64bit软件(Memory Analysis Tool)

    内存堆栈分析是Java应用程序性能优化的关键环节,尤其是在长期运行的服务中,内存泄漏可能导致系统资源耗尽,甚至引发服务崩溃。MAT(Memory Analyzer Tool)是一款强大的64位内存分析工具,由Eclipse基金会开发,专...

    易语言申请进程堆栈内存

    进程的堆栈内存管理是程序员必须理解和掌握的关键技能,特别是在低级编程或者系统级编程中。易语言,一种面向对象、简单易学的中文编程语言,也提供了对进程堆栈内存的操作支持。本文将详细解析"易语言申请进程堆栈...

    内存、堆栈详解

    ### 内存、堆栈详解 #### 一、内存分配器(Memory Allocator) 内存分配器是计算机程序中负责管理内存分配的重要组件。在本节中,我们将深入探讨内存分配器的工作原理及其在Go语言中的具体实现。 ##### 1.1 基于...

    Java堆栈内存分析笔记

    Java堆栈内存分析是Java编程中的重要概念,它关乎程序的性能优化和内存泄漏的预防。堆和栈是Java内存管理的两个主要区域,它们各自承担着不同的职责。本笔记将深入探讨这两个区域的工作原理以及如何进行有效的分析。...

    STM32堆栈内存分析

    ### STM32堆栈内存分析 #### 一、引言 在嵌入式开发中,了解内存管理机制对于编写高效且可靠的程序至关重要。本篇文章主要针对STM32微控制器的堆栈内存进行深入分析,旨在帮助开发者理解STM32如何管理和使用内存...

    gflags x86 x64 堆栈溢出内存检测工具

    《gflags:x86与x64架构下的堆栈溢出内存检测工具详解》 在软件开发过程中,确保程序的稳定性和安全性至关重要。而堆栈溢出是导致程序崩溃和安全漏洞的常见原因之一。为了有效地检测和预防这类问题,开发者可以使用...

    微软内存检查进程监测等工具包集

    该文档通常会介绍如何通过Vmmap进行任务特定的内存分析,比如如何识别内存使用异常的进程,以及如何使用Vmmap的高级功能,比如内存压力测试和内存堆栈跟踪等。 紧接着是Vmmap的可执行文件Vmmap.exe,这是一个能够...

    Delphi枚举内存堆.rar

    本文将深入探讨如何使用Delphi来枚举指定进程的内存堆,了解内存堆栈ID、内存基地址、占用内存大小以及相关的内存标志。我们将基于提供的资源——"Delphi枚举内存堆.rar"中的代码来展开讨论。 首先,我们需要明白...

    堆栈内存区别

    ### 堆栈内存区别详解 在计算机编程与运行环境中,堆栈(Heap vs Stack)是两种关键的数据存储区域,它们各自拥有独特的属性与管理方式,对于程序的性能与资源管理有着深远的影响。本文将深入解析堆栈的区别,探讨...

    堆栈与内存空间

    对堆栈和内存空间的详细描述,哪些是变量是在静态数据区分配的,动态分配是在堆上分配的

    易语言申请进程堆栈内存源码

    本话题主要围绕“易语言申请进程堆栈内存源码”这一主题展开,我们将深入探讨易语言如何处理进程、堆栈以及内存申请等核心概念。 首先,我们需要理解什么是进程。在操作系统中,进程是程序的一次执行实例,包含了...

    Java中内存泄露及垃圾回收机制参照.pdf

    在Java中,对象的建立和放置都是在内存堆栈上面进行的。程序或者其他的对象可以锁定一块堆栈地址来进行其他对象的引用。当一个对象没有任何引用的时候,Java的自动垃圾回收机制就发挥作用,自动删除这个对象所占用的...

    DrMemory-Windows-1.11.0-2_c++应用程序内存检测工具_

    DrMemory是由动态分析工具套件Peach Pit和惠普实验室共同开发的开源工具,它的主要功能是检查内存堆栈信息,发现并报告内存越界、空指针和野指针等常见的内存错误。通过深入分析程序运行时的内存行为,DrMemory可以...

    华中科技大学计算机学院计算机组成原理实验

    存储器分为内存(RAM)和外存(ROM、硬盘等)。学生可能需要模拟随机存取存储器的工作原理,理解读写操作,以及了解不同类型的存储器(如SRAM、DRAM)的特性。 6. **CPU实验(定长指令,现代时序,中断)**: CPU...

    JCL_Debug_StackTrace_Demo

    JCL通过分析内存堆栈,收集函数调用的历史,然后将这些信息转换为易于理解的字符串格式,这使得调试工作变得直观而高效。 在实际操作中,使用JCL进行堆栈跟踪通常涉及到以下步骤: 1. 引入JCL库:将JCL的单元文件...

    CDMA软件介绍 程序内存和堆栈

    在CDMA终端开发中,程序内存和堆栈的管理至关重要,因为这些资源通常是有限的,尤其是在内存容量仅为8M或16M的设备上。针对这种情况,开发者需要谨慎对待内存的分配与使用,以防止系统崩溃。 首先,程序内存的需求...

    头歌实践教学平台 MIPS流水CPU设计---HUST

    本实验从 MIPS 单周期 CPU 开始逐步构建无冲突冒险的理想指令流水线,能处理分支相关的指令流水线,采用气泡处理数据相关的气泡式流水线...第9关:多级嵌套中断(EPC内存堆栈保存).txt (其余关卡还在持续更新当中……)

    关于堆栈、静态、动态内存的理解

    一个正常的程序在内存中通常分为程序段、数据端、堆栈三部分。程序段里放着程序的机器码、只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。 在内存中...

Global site tag (gtag.js) - Google Analytics