2020-C++高级程序设计-C++ 动态内存
动态内存
- 操作系统中内存的一种形式
- 栈空间:局部变量、值传递参数
- 堆空间:动态内存分配的位置
- C:早在C之中已经有malloc和free等对动态内存操纵的函数。
- malloc() – memory allocation
- free() – free memory
- C++
- new – create space for a new object (allocate)
- delete – delete this object (free)
1. 动态对象
- 在heap中创建
- new/delete(constructor/destrutor),可以被重载
- 为什么要引入new和delete操作符:因为新的操作符可以解决初始化函数的析构函数的调用的问题
- 具体示例如下:
1 |
|
- malloc(不调用构造函数)|free(不调用析构函数)
- new可以重载
1 |
|
2. 创建对象
- new:
- 使用原始类型
- 使用类类型
- Syntax:语法
- 原始类型:
type* ptrName = new type;
- 使用类类型:
type* ptrName = new type(params);
- 原始类型:
- 注意:这是没有变量名字的物体
关于对象指针
3. 对象的删除
- delete:
- 唤起指向物体的指针
- 处理原始类型或类类型
- 语法:
delete ptrName;
- 注意:删除之后,要将指针置为空指针,这样子之后可以继续使用,避免意外的引用对象,如果指针没有修改的话,可能是一个悬挂指针(有可能出现段错误等等)
1 |
|
4. 动态对象数组
- 动态对象数组的创建与撤销
1 |
|
- 注意:
- 不能显式初始化,相应的类必须有默认构造函数
- 初始化部分是修改比较多的
- 在堆上分配的内存默认不进行初始化
int *p1 = new int[5];
默认不进行初始化int *p2 = new int[5]();
进行默认初始化int *p2 = new int[5]{0,1,2,3,4}
:进行显式对应函数初始化
- 注意:
delete []p
中的[]不可以省略- 如果省略的话,是删除了数组的第一个元素。并且会破坏其中的存储数组长度
new int[100]
就可以直接delete,因为不是复杂对象
5. 动态2D数组
- 创建算法:
- 分配行的数量
- 对于每一行分配列
1 |
|
- 删除算法:和创建算法相反
1 |
|
2020-C++高级程序设计-C++ 动态内存
https://spricoder.github.io/2020/07/01/2020-C-plus-plus-advanced-programming/C++-OOP/2020-C-plus-plus-advanced-programming-C++%20%E5%8A%A8%E6%80%81%E5%86%85%E5%AD%98/