1. 内存结构:
内核空间 (用户代码不能读写) |
栈(向下增长) |
内存映射段 (文件映射、动态库、匿名映射) |
堆(向上增长) |
数据段 (全局数据、静态数据) |
代码段 (可执行代码/只读常量) |
2. C++内存管理方式:new、delete
1)内置类型中的new、delete:
内置类型中的new并不会自己初始化创建的变量,需要人工初始化;
针对内置类型,new/delete 跟 malloc/free 没有本质区别,只有用法的区别,new/delete用法简化了!
//new用法:new + 类型
int* P2 = new int;//用new开辟出一个int空间,并把起始地址给P2
int* P2 = new int[5];//用new开辟出5个int空间(其实是连续的空间),并把起始地址给P2
int* P2 = new int(5);//用new开辟出一个int空间,并初始化为5,并把起始地址给P2
int* P2 = new int[5]{1,2,3};//用new开辟出5个int空间(其实是连续的空间),并初始化为1,2,3,0,0,并把起始地址给P2
//delete用法:delete + 地址
delete P2;//释放P2对应的一段空间(对应于一个空间类型,如1个int)
delete[] P2;//释放P2对应的一段空间(对应于多个空间类型,如5个int)
2)自定义类型中的new、delete:
其实C++中的new、delete是为自定义类型准备的,不仅在堆中申请出空间,还会用构造函数和析构函数
//自定义类型:A
A* P2 = new A;//开辟一个A大小的空间并把地址给P2,并调用构造函数初始化
delete P2;//释放P2所指的空间,并调用析构函数(P2为自定义类型开辟的空间的地址)