new和delete

        

目录

new的使用

new相对于malloc的优势

new实现的实质

1.内置类型

2.自定义类型

delete使用


        在C语言中,动态开辟空间使用可以使用库函数malloc,在C++中仍然可以这样做,但在C++中有更好的方法——运算符new

new的使用

使用new分配内存的通用格式如下

                    typeName  *  pointer_name =  new  typeName;

以下是一些new常用的场景

int* p1 = new int; //new一个int类型
delete p1;

int* p2 = new int(1);//new一个int类型,并且初始化为1
delete p2;

int* p3 = new int[10];//new一个有十个元素的int数组
delete[]p3;

int* p4 = new int[10]{ 1,2,3,4,5,6,7,8,9,10 };//new一个有十个元素的int数组,并且初始化
delete[]p4;

A* p5 = new A;//new一个A对象
delete p5;

new相对于malloc的优势

1.malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可

如果是多个对象,[]中指定对象个数即可
2.malloc申请的空间不会初始化,而new申请的空间可以初始化
3.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new
在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成
空间中资源的清理
4.new申请空间失败直接抛出异常,而并非返回NULL,因此不需要在使用后对指针是否为NULL进行判断

new实现的实质

1.内置类型

在内置类型中,new和malloc是类似的,不同之处有两点

1.new能够对申请空间进行初始化,操作如下:

int* p = new int(1);//申请一个int空间并且初始化为1

2.new申请失败抛出异常,malloc申请失败返回NULL

2.自定义类型

在自定义类型中

new = operator new + 构造函数

operator new 是一个开辟空间的函数,实际上他开辟空间使用的也是malloc,但是在面向对象编程中malloc不太适用,反而抛出异常的方式更加合理,因此使用 operator  new 对malloc 进行了封装,让他 成为了抛出异常的开辟空间函数。

delete = 析构函数 + operator delete

与operator  new 类似 ,operator delete 是对free的封装 ,使其符合C++使用的预期。

delete使用

有new的地方,一定会有与之对应的delete,用于释放new申请的空间

虽然在程序终止时,操作系统会自动释放开辟的动态空间,但是在长期运行的程序中,如果不谨慎使用new / delete,往往会造成内存泄露。因此我们使用new,一定要配套使用delete,并且delete只能释放new申请的空间。

常用格式如下

int* p1 = new int; //new一个int类型
delete p1;//释放开辟的int空间
	
int* p3 = new int[10];//new一个有十个元素的int数组
delete[]p3;//释放开辟的int数组空间
	
A* p5 = new A;//new一个A对象
delete p5;//释放开辟的A对象空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值