用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操作符的形式.
这里要说明的是,当类中重载了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操作符创建函数的过程发生了什么
- C++ try 块里 new 类对像构造异常时发生“回退”并对资源自动释放
- 关于构造中new的异常捕获!
- 异常发生时的硬件操作及异常返回时的处理
- javascript 构造函数和new操作符
- C++ 让new操作符失败时抛出自定义的异常
- ASP 上传文件时,发生了未处理的异常 007 asp 0104不允许操作
- MapXtreme 操作地图时出现调用目标发生异常的解决方法--地图状态保存
- MapXtreme 操作地图时出现调用目标发生异常的解决方法--地图状态保存
- VC操作Excel,使用Worksheet的get_Range发生异常
- EFPower tool 使用时发生的异常
- 避免异常发生时的资源泄漏
- "Null"与字符串操作符"+" null+字符串时不会发生异常
- 结构和类中字段的初始化以及用new来操作他们的构造函数
- 如何让new操作符不分配内存,只调用构造函数 (不错的文章)
- c++ 嵌套new操作构造对像的执行顺序
- Java2十大经典图书
- MyEclipse快捷键
- DB2 Universal Database 与 Oracle 的数据移动比较指南
- Mashup技术思考
- 深入了解Java ClassLoader(转帖)
- 用new操作符构造发生异常时的说明
- [收藏]运用Ajax和XML,自己也能做视频网站~
- Windows下MPlayer编译详细步骤
- 托管代码
- netbeans 窗口导航快捷键
- 70后、80后、90后的区别
- 用eclipse配置JSP还需要下载哪些插件?
- 用eclipse配置JSP还需要下载哪些插件?
- Tomcat使用