当用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操作符的形式.
这里要说明的是,当类中重载了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操作符的形式.
