内存管理
a、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量。
b、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。
c、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。
数据段 | 存放内容 | 特点 |
---|---|---|
BSS | 程序中未初始化的全局变量和静态变量 | 可读写,在程序执行之前BSS段会自动清0。所以未初始的全局变量在程序执行之前已经成0了。 |
DATA数据段 | 程序中已初始化的全局变量 | 数据段属于静态内存分配。 |
TEXT代码段 | 程序执行代码 | 区域大小在程序运行前就已经确定,通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中也有可能包含一些只读的常数变量,例如字符串常量等。 |
HEAP堆 | 进程运行中被动态分配的内存段 | 大小不固定,可动态扩张或缩减。malloc/new(堆被扩张)free/delete(堆被缩减) |
STACK栈/堆栈 | 程序临时创建的局部变量 | 函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。堆栈看成一个寄存、交换临时数据的内存区 |
- 堆和栈的区别
a、申请方式不同。栈上有系统自动分配和释放;堆上有程序员自己申请并指明大小;
b、栈是向低地址扩展的数据结构,大小很有限;堆是向高地址扩展,是不连续的内存区域,空间相对大且灵活;
c、栈由系统分配和释放速度快;堆由程序员控制,一般较慢,且容易产生碎片; - 全局变量和局部变量有什么区别?怎么实现的?操作系统和编译器是怎么知道的?
a、生命周期不同:
全局变量随主程序创建和创建,随主程序销毁而销毁
局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;内存中
分配在全局数据区
b、使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用,分配在栈区
操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面。 - 局部变量和全局变量是否可以同名?
能。局部会屏蔽全局。要用全局变量,需要使用”::”(域运算符)。 - static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?
static全局变量与普通全局变量区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量区别:static局部变量只被初始化一次,下一次依据上一次结果值;
new/delete和malloc/free的区别和联系
两大区别:
第一:malloc和free是函数,需要包含相关头文件,new和delete是操作符
第二:new和delete除了分配释放堆内存之外,还调用了构造函数和析构函数
new/delete都是要分两步操作的:new分配内存,并且调用对象的构造函数初始化一个对象;delete调用相应的析构函数,然后释放内存
malloc/free只是分配内存/回收内存,
malloc需要头文件"stdlib.h"或者"malloc.h";
在C++中依赖brk()系统调用增长堆空间?
new/delete都是内建的操作符,而malloc是一个函数,其函数原型是:
void *malloc(unsigned int num_bytes);