程序内存的分区(详解)

基础知识每日一记(3)

1.程序中的内存从哪里来?

1、程序执行需要内存支持。 程序是放在内存中运行,程序运行时需要内存来存储一些临时变量。

2、内存本身在物理上是一个硬件器件,由硬件系统提供。

3、内存是由操作系统统一管理。 为了内存管理方便又合理,操作系统提供了多种机制来让应用程序使用内存。根据自己的使用情况来选择某种方式获取内存、使用内存、释放内存。

2.内存分区介绍:

  • 我们的内存一般分为四个区域提供使用,且每个区域存放的数据不同,使用效果也不同。
  • 它们分别是:堆区、栈区、全局区(静态区)、代码区。

2.1.代码区:

  • 程序代码存放的位置(编译后的可执行二进制代码)。
  • 特点:共享性,只读性,在程序运行前就存在。

2.2.全局区(静态区)

  • 存放全局变量、静态变量、静态函数的位置。
  • 特点:在程序结束后才释放,并且在内部还分为.bss区(未初始化)和.data区(已初始化)。

2.3.栈区:

  • 存放普通局部变量(包括const修饰的局部变量)、函数的参数的位置。

2.3.1栈的特点:

1、栈是在运行时自动分配和自动收回:栈是自动管理的、程序员不需要手工干预。

2、反复使用:栈内存在程序中其实就是一块空间,程序反复使用这一块空间。

( 栈是哪来的?—— 应用程序在操作系统中运行时,操作系统分配一块栈空间给应用程序使用。栈大小由操作系统决定的。栈指针是由操作系统控制 )

3、脏内存:由于栈是反复使用的,每次使用后程序不会清理,因此分配到时保留原来的值

4、临时性:变量在栈上只是临时分配了一个内存空间使用

5、栈会溢出:操作系统分配的栈大小是有限的。大量使用栈会造成栈溢出。

2.3.2使用栈时的注意点:

  • 程序中定义局部变量的时候必须初始化。否则会出现莫名错误。
  • 函数不能返回栈变量的指针,因为这个空间是临时的。
  • 定义局部变量不能太大,避免栈溢出。

2.4.堆区:

  • 存放程序运行时动态申请的空间。
  • 特点:一般需要程序员手动释放。

2.4.1堆的特点:

1、操作系统堆管理器管理:堆管理器是操作系统的一块模块,堆管理内存分配灵活,按需分配。

2、大块内存:堆内存管理者总量很大的操作系统内存块,各程序按需向操作系统去申请,使用完之后要释放。

3、程序手动申请和释放:需要程序员写代码去申请malloc和释放free(或者new)。

4、脏内存:堆内存也是反复使用的,使用者用完释放前不会清除。

5、临时性:堆内存只有在malloc和free之间属于这个进程,可以访问。

2.4.1使用堆时的注意点:

  • malloc申请的内存时用完后要free释放。 free(p);会告诉对管理器这段内存我用完了可以回收了(new出来的记得delete)。堆管理器回收了这段内存后这段内存当前进程就不应该再使用。因为释放后堆管理器就可能把这段内存再次分配给别的进程。
  • 调用free归还这段内存之前,指向这段内存的指针p一定不能丢。 因为p一旦丢失这段malloc来的内存就永远的丢失了(内存泄露),直到当前程序结束时操作系统才会回收这段内存。
  • gcc中的malloc默认最小以16B分配单位的。 如果malloc小于16B的大小时都会返回一个16字节的大小内存。所以在你申请malloc(0)和malloc(4),堆管理器都分配16字节空间。

3.补充:

部分内容转载于:

https://blog.csdn.net/weixin_43564241/article/details/127830981

#晒一晒我的offer##软件开发薪资爆料##我的实习求职记录##23届找工作求助阵地##我的求职思考#
全部评论
1 回复 分享
发布于 2023-09-05 08:58 广东

相关推荐

10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务