栈区、堆区、静态区

一、栈区(Stack)

1.栈区是什么

栈区(Stack)是计算机内存中的一部分,用于存储程序运行时的临时数据

2.栈区的有关性质

(1)存储临时数据

• 栈区主要用于存储局部变量(比如函数内部定义的变量)和函数调用时的上下文信息(比如返回地址和参数)。

(2)后进先出

• 就像你把一张便签纸放在一堆便签纸的顶部,当你需要拿一张便签纸时,你总是先拿最上面的那张。在栈区中,最后被放入的数据会最先被取出

(3) 自动内存管理

• 当你进入一个函数时,栈区会自动为这个函数的局部变量分配空间。当你离开这个函数时,这些空间会自动被释放,不需要程序员手动管理.

(4)快速访问

• 由于栈区通常位于CPU的高速缓存附近,所以访问栈区中的数据速度非常快。

(5) 大小限制

• 栈区的大小是有限的,通常比堆区(Heap)小。如果一个程序使用了大量的局部变量或者递归调用了太深的函数,可能会导致栈溢出错误

(6)调用函数时的作用

• 当一个函数被调用时,它的参数、返回地址和局部变量都会被压入栈区。当函数执行完毕后,这些信息会被弹出栈区,以便调用下一个函数。

二、堆区(Heap)

1.堆区是什么

堆区(Heap)是计算机内存中用于动态内存分配的区域。

2.堆区的有关性质

(1) 动态内存分配

• 堆区允许程序在运行时动态地分配和释放内存,这与栈区的自动内存管理不同。程序员需要明确地告诉程序何时分配内存 (如使用malloc-->C语言new-->c++),以及何时释放内存(如使用free-->C语言delete-->c++)。

mallocfreeC 语言 标准库中的函数,malloc用于动态内存分配free 函数释放内存

c 复制代码
#include <stdio.h>
#include <stdlib.h>

int main()
 {
    int *p = (int *)malloc(sizeof(int) * 10); // 分配一个可以存储10个int类型数据的内存块
    if (p == NULL)
     {
        printf("Memory allocation failed.\n");
        return 1;
    }

    // 使用分配的内存
    for (int i = 0; i < 10; i++) 
    {
        p[i] = i;
    }

    // 释放内存
    free(p);

    return 0;
}

new deleteC++ 中的运算符,new用于动态内存分配 , delete运算符用于释放内存

(2)可自由调配

• 程序员可以根据需要分配任意大小的内存块,而不受固定大小限制

(3)大小

•堆区的大小通常比栈区大

3.堆区可能出现的问题

(1) 内存泄漏

• 如果程序员忘记释放不再使用的内存或者释放了错误的内存,就可能导致内存泄漏。这会逐渐消耗掉可用的内存资源,最终可能导致程序崩溃。

(2)内存越界

• 由于堆区的内存管理是由程序员控制的,因此更容易出现越界错误,比如访问已经释放的内存或者未分配的内存。

三、静态区(Static Area)

1.静态区是什么

静态区(Static Area),也称为全局数据区或数据段(Data Segment),是计算机内存中用于存储程序中全局变量静态变量的部分。

2.静态区的有关性质

(1)存储全局变量

• 静态区用来存储程序中定义的全局变量,这些变量在程序的整个运行期间都存在。

(2)存储静态变量

• 静态区存储在函数内部定义的静态变量。这些变量即使在函数调用结束后也不会被销毁,它们的值会在函数调用之间保持。

(3)初始化

• 静态区中的变量在程序启动时会被初始化 。对于全局变量和静态变量,如果没有显式初始化 ,它们会被自动初始化为0

(3)生命周期

• 静态区中的变量具有程序的整个生命周期,即从程序启动到程序结束。

(4)内存泄漏

• 由于静态区的内存是在程序启动时分配的,所以不涉及内存泄漏的问题,除非程序设计不当导致资源未能正确释放。

相关推荐
Scott9999HH7 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社8 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海8 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖9 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区11 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大12 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai12 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜12 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa12 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio