用new操作符构造发生异常时的说明

本文探讨了C++中new和delete操作符的行为及其重载机制,特别是当构造对象失败时如何正确释放资源。文章详细解释了不同形式的new和delete操作符之间的交互,并强调了在重载这些操作符时需要注意的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当用new构造对象产生异常时,由于编译器早已插入相应的delete函数,所以会在发生异常时刻调用相应形式的delete,以确保资源的释放.
     这里要说明的是,当类中重载了new操作符后,则在应用new表达式时,如果不是限定全局new,则只在该类中寻找可行函数.即使由于参数个数不匹配导致失败,也不会再用全局的.原因是,解析已经完成.出错只是可行函数不存在而已.
因此,当你重载定位new时,请确保同时重载普通的new,否则,用new的非定位表达式,会造成无法调用.同样,delete也是如此.只要重载了delete,则不再解析全局的.
    但是new跟数组形式的new是不同的.即是说,如果只重载数组形式的new,而不提供普通new的重载,则调用普通new时,仍考虑全局的.因为数组形式的跟普通非数组形式的不是一个类别的.
    总而言之,当使用new表达式构造产生异常时,会调用相应形式的delete操作,如果没有找到,则不调用.注意,这个自动发生的过程只存在于用new构造产生异常时,而且如果没有catch到异常,这个delete操作也不会发生,即使发生了,也没有意义了,因为没有catch就表明程序终止了,资源释放与否已没有意义.
   其它情况下,仍需要自己管理内存.
    另一个要说明的是,delete的两种形式.
    void operator delete(void*);
     void operator delete(void*,size_t);
如果同时提供,在调用时是不会发生二义的.一般的调用delete表达式,均是调用单参数的形式.除非是显式地调用相应的静态delete操作符的形式. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值