定位new表达式

定位new运算符允许在已分配的内存上构造对象,不负责内存分配,而是使用指定地址。它不抛出异常,返回空指针表示失败。使用时需注意手动调用析构函数并按创建顺序逆序删除对象,且无需使用delete释放内存。
摘要由CSDN通过智能技术生成

默认情况下,如果new不能分配说需要的内存空间,它会抛出一个类型为bad_alloc的异常。我们可以改变使用new的方式来阻止它抛出异常:

//如果分配失败,new返回一个空指针
int* p1 = new int;    //如果分配失败,new抛出std::bad_alloc
int* p2 = new (nothrow) int;     //如果分配失败,new返回一个空指针。

我们称这种形式的new为定位new

定位new表达式允许我们向new传递额外的参数。如上面的nothrow。如果将nothrow传递给new.我们的意图是告诉它不能抛出异常。如果这种形式的new不能分配所需内存,它会返回一个空指针。

 

在c++早期版本中,有一个allocator类。其中的成员函数allocate负责分配内存空间,deallocate用来释放内存空间。但这两个函数不会构造或销毁对象。而是由construct函数来构造对象,用destroy函数来释放对象。

对于operator new分配的内存来说,我们无法用construct函数构造对象。相反,我们应该用new的定位new形式构造对象。

定位new的形式:

new (place_address) type
new (place_address) type (initializers)
new (place_address) type [size]
new (place_address) type [size] {braced initializer list}

其中place_address必须是一个指针。同时在initializers中提供一个(可能为空的)以逗号分隔的初始值列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值