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

来源:互联网 发布:apache不允许浏览目录 编辑:程序博客网 时间:2024/04/30 22:53
当用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操作符的形式. 
原创粉丝点击