程序内存的分区(详解)
基础知识每日一记(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届找工作求助阵地##我的求职思考#