【C++ 内存管理】静态分配和动态分配
文章目录
- 1.静态分配
- 2.动态分配
- 3.对静态分配和动态分配理解
- 4.析构函数调用顺序
- 5.new[ ] 为什么会多申请内存呢?
1.静态分配
-
定义:
在编译阶段确定内存大小和生命周期,由编译器自动分配和释放。 -
特点:
①分配时机:程序启动时分配,程序结束时释放。
②内存区域:数据段(全局变量或者静态变量)和栈区。
③生命周期:与程序或模块的执行周期一致。
④大小固定:内存大小在编译时已知,不可动态调整。
⑤无需手动管理:由编译器自动释放。
2.动态分配
-
定义:
在程序运行阶段动态分配内存,由程序员显示控制。 -
特点:
①分配时机:运行时动态申请(如 malloc, new)和释放(如 free, delete)。
②内存区域:堆区或者栈区(栈可以通过函数_alloca进行动态分配,不过注意,所分配空间不能通过free或delete进行释放)。
③生命周期:由程序员显示控制。
④大小可变:内存大小在运行时确定,可动态调整(如 realloc)。
⑤需要手动管理:需显式释放内存。
3.对静态分配和动态分配理解
- 题目一:C++中关于堆和栈的说法,哪个是错误的:( C )
4.析构函数调用顺序
- 题目二:设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为? (A—> B—> D—> C )
解析:先显示调用的delete pa,所以pa先析构,然后我们再观察有无局部变量,局部变量的析构顺序是先声明的后析构,只有一个局部变量b析构,最后查看静态变量和全局变量,同样要遵守先声明的后析构,所以d先析构,最后再析构c。
C c;
void main()
{
A*pa=new A();
B b;
static D d;
delete pa;
}
5.new[ ] 为什么会多申请内存呢?
使用 new A 时,编译器需记录元素个数,以便 delete[] 能正确调用每个元素的析构函数。编译器在数组内存块头部多分配4字节(32位系统)或8字节(64位系统),用于存储元素数量。
对于内置类型,delete[] 释放 char 数组时,无需调用析构函数,仅需释放内存。所以不需要多开内存来存储元素数量。