- 操作系统中内存的一种形式
- 栈空间:局部变量、值传递参数堆空间:动态内存分配的位置
- malloc() – memory allocationfree() – free memory
- new – create space for a new object (allocate)delete – delete this object (free)
- 在heap中创建new/delete(constructor/destrutor),可以被重载为什么要引入new和delete操作符:因为新的操作符可以解决初始化函数的析构函数的调用的问题具体示例如下:
class A {
public :
A () ;
A (int);
};
A *p,*q;
p = new A;
//在程序的 heap 中申请一块大小为 sizeof(A) 的 内存
//新的功能:调用 A 的默认构造函数对该空间上的对象初始化
//返回创建的对象的地址并赋值给 p
q = new A(1);
//调用 A 的另一个构造函数 A::A(int)
delete p;
//新功能:调用 p 所指 向 的对象的析构函数
//释放对象空间 delete q ;
- malloc(不调用构造函数)|free(不调用析构函数)
new可以重载
p = (A *)malloc(sizeof(A))//A中的成员变量没有初始化 free(p)2. 创建对象
- new:
- 使用原始类型使用类类型
- 原始类型:type* ptrName = new type;使用类类型:type* ptrName = new type(params);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVZupmwm-1645750994971)(https://spricoder.oss-cn-shanghai.aliyuncs.com/2020-C-plus-plus-advanced-programming/C+±OOP/img/1.png)]
3. 对象的删除关于对象指针
- delete:
- 唤起指向物体的指针处理原始类型或类类型
delete ptrName; ptrName = NULL;4. 动态对象数组
- 动态对象数组的创建与撤销
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}:进行显式对应函数初始化
- 如果省略的话,是删除了数组的第一个元素。并且会破坏其中的存储数组长度new int[100]就可以直接delete,因为不是复杂对象
- 创建算法:
- 分配行的数量对于每一行分配列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wp6eUu9D-1645750994971)(https://spricoder.oss-cn-shanghai.aliyuncs.com/2020-C-plus-plus-advanced-programming/C+±OOP/img/15.png)]
const int ROWS = 3;
const int COLUMNS = 4;
char **chArray2;
// allocate the rows 粉色部分
chArray2 = new char* [ROWS];
// allocate the (pointer) elements for each row 蓝色部分
for (int row = 0; row < ROWS; row++ )
chArray2[row] = new char[ COLUMNS ];
- 删除算法:和创建算法相反
for (int row = 0; row < ROWS; row++) {
delete []chArray2[ row ];
chArray2[ row ] = NULL;
}
delete []chArray2;
chArray2 = NULL;



