← C++ 高级程序设计(2020) 2020-C++高级程序设计-C++ 动态内存 发布 2020-07-01 更新 2022-03-07 约 6 分钟阅读 阅读 — 次
学习记录 2020 年课程笔记
动态内存
操作系统中内存的一种形式
栈空间:局部变量、值传递参数
堆空间:动态内存分配的位置
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class A { public : A () ; A (int ); }; A *p,*q; p = new A; q = new A (1 );delete p;
malloc(不调用构造函数)|free(不调用析构函数)
1 2 p = (A *)malloc (sizeof (A))free (p)
2. 创建对象
new:
使用原始类型
使用类类型
Syntax:语法
原始类型:type* ptrName = new type;
使用类类型:type* ptrName = new type(params);
注意:这是没有变量名字的物体
关于对象指针
3. 对象的删除
delete:
唤起指向物体的指针
处理原始类型或类类型
语法:delete ptrName;
注意:删除之后,要将指针置为空指针,这样子之后可以继续使用,避免意外的引用对象,如果指针没有修改的话,可能是一个悬挂指针(有可能出现段错误等等)
1 2 delete ptrName; ptrName = NULL ;
4. 动态对象数组
动态对象数组的创建与撤销
1 2 3 A *p; p = new A[100 ];delete []p;
注意:
不能显式初始化,相应的类必须有默认构造函数
初始化部分是修改比较多的
在堆上分配的内存默认不进行初始化
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 2 3 4 5 6 7 8 9 10 const int ROWS = 3 ;const int COLUMNS = 4 ;char **chArray2; chArray2 = new char * [ROWS];for (int row = 0 ; row < ROWS; row++ ) chArray2[row] = new char [ COLUMNS ];
删除算法:和创建算法相反
1 2 3 4 5 6 for (int row = 0 ; row < ROWS; row++) { delete []chArray2[ row ]; chArray2[ row ] = NULL ; }delete []chArray2; chArray2 = NULL ;
评论