new和delete关键字:(动态创建一个string数组)
动态创建一个变量:
动态创建一个数组:
动态创建二维数组:
new总结:
1.指针=new 类型名; //动态创建一个对象
2.指针=new 类型名(初始化参数) ; //动态创建一个对象,可不初始化
3.指针=new 类型名[数组长度]{初始化列表};//用于动态分配数组,可没有初始化列表(string类型就一定要有)
◼ 类型可为基本类型, 也可为类类型。
• 若为类类型, 则初始化参数相当于将实际参数传递给该类的构造函数
◼ new运算返回一个该类型指针 , 指向分配到的内存空间
◼ 若内存分配失败, 抛出异常结束程序, 而不是返回 NULL
delete总结:
1.delete 变量名; //基本用法
2.delete []变量名; //用于释放数组
◼ 如果动态分配了一个数组, 但是却用delete p的方式释放, 没有用[ ], 则
• 编译时没有问题, 运行时也一般不会发生错误,
• 但实际上会导致动态分配的数组没有被完全释放。
◼ delete释放的是指针所指对象占据的内存。
• delete对象指针, 会调用该对象的析构函数。([ ]将令其中所有元素都调用各自析构函数)
• 用delete释放空间后, 指针的值仍是原来指向的地址, 但指针已无效( 重复释放将出错,即非法指针访问) 。
◼ delete 本身会自动检查对象是否为空 .如果为空 , 就不做操作,因此delete空指针不需要特判
◼ 为防止重复删除出错,最好删除后就把指针赋为空
内存泄漏:
指new的指针丢失导致占用内存永远无法释放
显式默认化函数定义 =default
只需在函数声明后加上=default,就可将该函数声明为 default 函数,编译器将为显式声明的default函数自动生成函数体。
• 若以=default声明,则该函数不能写实现
• 只能对特殊成员函数的默认无参使用,特殊成员函数包括:
默认构造函数
析构函数
复制构造函数等
例如:(有参时用前面的,无参时用默认,这时不能写A()的实现)