SYSU程设c++(第五周)new和delete关键字、动态创建变量/数组、内存泄漏、default

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()的实现)

猜你喜欢

转载自blog.csdn.net/jz_terry/article/details/129731069