- 浏览: 498379 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jkxydp:
算法运行的结果根本就不对。
BM算法. -
soarwindzhang:
感谢博主的分享,我今天看了您的UFSET非递归的路径压缩时感觉 ...
并查集 -
zhangning290:
楼主好像只考虑了坏字符规则,。没有考虑好后缀
BM算法. -
lsm0622:
文字描述有错误 误导新学者
求有向图的强连通分量(scc):Tarjan算法 -
knightchen:
博主,你太强了!这篇文章对我学习C++多线程很有帮助!谢谢
并发学习之一_windows下ZThread在CodeBlocks上的安装与配置
1,当operator new无法满足内存需求时,抛出std::bad_alloc.
下面是一个验证的代码:
2,C++的一个公约:
当operator new无法满足需求时,它会在抛出exception前先调用一个专属的错误处理函数.
我们称之为:new-handler.
3,当operator无法满足内存需求时,它会不只一次的调用new-handler函数;
它会不断的重复调用,直到找到足够的内存.
一个设计良好的new-handler函数必须完成下面几件事:
(1)让更多内存可用.
例如:事先在程序起始处配置一大块内存,然后在new-handler第一次被调用时释放之.
(2)配置另外一个new-handler,其手上握有比较多的资源.
(3)卸除new-handler,set_new_handler(NULL)
将不再调用专属函数,而直接抛出exception.
(4)抛出exception.
(5)不回返,直接调用abort()或exit.
4,设定类class专属的new-handler.
一个强大的类模板.
5,旧的编译器:
如果内存配置失败不会抛出异常,只是返回0.
测试实例:
int* p=new (nothrow)int;
if(p==0)
cout<<"memory error;"<<endl;
下面是一个验证的代码:
#include <iostream> #include <stdexcept> using namespace std ; int main () { try { int* p=NULL; while(1) p=new int[10000]; }catch(std::bad_alloc&) { cout<<"no enough mem."<<endl; } return 0 ; }
2,C++的一个公约:
当operator new无法满足需求时,它会在抛出exception前先调用一个专属的错误处理函数.
我们称之为:new-handler.
3,当operator无法满足内存需求时,它会不只一次的调用new-handler函数;
它会不断的重复调用,直到找到足够的内存.
一个设计良好的new-handler函数必须完成下面几件事:
(1)让更多内存可用.
例如:事先在程序起始处配置一大块内存,然后在new-handler第一次被调用时释放之.
(2)配置另外一个new-handler,其手上握有比较多的资源.
(3)卸除new-handler,set_new_handler(NULL)
将不再调用专属函数,而直接抛出exception.
(4)抛出exception.
(5)不回返,直接调用abort()或exit.
#include <iostream> #include <stdexcept> using namespace std ; void noMoreMemory() { cout<<"Unable to satify request for memory."<<endl; //原则(5):不回返 abort();//不加,将会是一个死循环. //原则(4):也可以通过抛出一个异常 //throw std::bad_alloc(); } int main () { //typedef void (*new_handler)(); 头文件中已经给出 //设定自己的专属错误处理函数. //返回之前的new_handler new_handler old_new_handler=set_new_handler(noMoreMemory); //set_new_handler(NULL); //卸除new-handler,抛出异常. try { int* p=NULL; while(1) p=new int[10000]; }catch(std::bad_alloc&) { cout<<"no more memory."<<endl; set_new_handler(old_new_handler); } set_new_handler(old_new_handler); return 0 ; }
4,设定类class专属的new-handler.
一个强大的类模板.
#include <iostream> #include <stdexcept> using namespace std ; template<class T> class NewHandlerSupport { public: static new_handler set_new_handler(new_handler p); static void* operator new(size_t size); static void* operator new[](size_t size); private: static new_handler currentHandler; }; template<class T> new_handler NewHandlerSupport<T>::set_new_handler(new_handler p) { new_handler oldHandler=currentHandler; currentHandler=p; return oldHandler; //返回之前的专属函数 } template<class T> void* NewHandlerSupport<T>::operator new(size_t size) { //下面调用标准的set_new_handler new_handler globalHandler=std::set_new_handler(currentHandler); void* memory; try { //使用标准的new. memory=::operator new(size); }catch(std::bad_alloc) { std::set_new_handler(globalHandler); throw; //继续抛出异常 } std::set_new_handler(globalHandler); //返回原来的设置 return memory; //返回之前的专属函数 } template<class T> static void* NewHandlerSupport<T>::operator new[](size_t size) { return operator new(size); } template<class T> new_handler NewHandlerSupport<T>::currentHandler; //设置为0 void noMoreMemory() { cout<<"Unable to satify request for memory."<<endl; //abort(); throw std::bad_alloc(); } class X : public NewHandlerSupport<X> { }; int main () { X::set_new_handler(noMoreMemory); try { X* p=NULL; //先调用专属函数,然后有专属函数抛出异常. while(1) p=new X[100000]; }catch(std::bad_alloc&) { cout<<"no more memory."<<endl; } X::set_new_handler(0); try { X* p=NULL; //不再调用专属函数,直接捕获异常. while(1) p=new X[100000]; }catch(std::bad_alloc&) { cout<<"no more memory."<<endl; } return 0 ; }
5,旧的编译器:
如果内存配置失败不会抛出异常,只是返回0.
测试实例:
int* p=new (nothrow)int;
if(p==0)
cout<<"memory error;"<<endl;
发表评论
-
条款43:明智地使用多继承
2010-06-08 09:33 13401,多继承带来的一个根本性的复杂性:模棱两可. 例如: # ... -
条款44:说出你的意思并了解你所说的每一句话
2010-06-08 09:30 7801,彻底了解不同的面向对象架构在C++中的意义. 2,声明一 ... -
条款30:避免写出member function,传回一个non-const function或reference并指向private或protect成员
2010-06-08 09:29 11971,先看一个例子: class Address { ... } ... -
条款4:尽量使用C++风格的注释形式
2010-06-07 09:49 7201,抛弃"/*...*/",改用" ... -
条款39:避免在继承体系中做向下转型(downcast)动作
2010-06-01 10:37 14451,先看个例子: class Person { ... }; ... -
条款2:尽量以<iostream>取代<stdio.h>
2010-06-01 10:36 9801,scanf和printf的缺点:不具有型别安全(type- ... -
条款1:尽量以const和inline取代#define
2010-06-01 10:35 9211,意思就是"尽量以编译器(compiler)&qu ... -
条款42:明智地使用private inheritance(私有继承)
2010-05-29 17:51 9551,先搞清楚private inheritance的行为: ( ... -
条款41:区分inheritance和template
2010-05-29 17:50 6701,首先考虑一个问题: 型别T会影响class的行为吗? 如果 ... -
条款40:通过layering技术来模塑"有一个"(has-a)或"根据某物实现(is-implemented-in-terms-of)"
2010-05-29 17:48 7651,所谓laying,就是以一个class为本,建立另外一个c ... -
条款38:绝对不要重新定义继承而来的缺省参数值
2010-05-29 17:48 7901,首先可以安全的把问题讨论局限于"继承一个带有缺省 ... -
条款37:绝对不要重新定义继承而来的非虚拟函数
2010-05-29 17:47 7301,先看个例子: class B { public: vo ... -
条款36:区分接口继承和实现继承
2010-05-29 17:46 8481,public继承分为两类:接口继承和实现继承. 这两种继承 ... -
条款35:确定你的public继承,模塑出"isa"的关系
2010-05-29 17:46 9611,C++面向对象程序设计最重要的原则: public继承意味 ... -
条款29:避免传回内部数据的handles
2010-05-28 10:35 13511,考虑下面的代码: class string { oper ... -
条款28:尝试切割global namesapce
2010-05-28 10:34 6841,namesapce的使用 namespace std{ ... -
条款50:加强自己对C++的了解
2010-05-25 11:46 8761,只推荐两本书: (1)D&E: The Desig ... -
条款49:尽量让自己熟悉C++标准库
2010-05-25 11:46 7831,标准库的每一样东西几乎都在namespace std中,然 ... -
条款48:不要对编译器的警告视而不见
2010-05-25 11:45 7701,在你忽略一个警告之前,你必须精确了解编译器企图告诉你的是什 ... -
条款47:使用non-local static objects之前先确定它已有初值
2010-05-25 11:45 8341,当一个编译单元内某对象的初始化动作,与另一个编译单元内某对 ...
相关推荐
条款7:预先准备好内存不够的情况 条款8: 写operator new和operator delete时要遵循常规 条款9: 避免隐藏标准形式的new 条款10: 如果写了operator new就要同时写operator delete 第三章 构造函数,析构函数和赋值...
条款7:预先准备好内存不够的情况 条款8:写OPERATOR NEW与OPERATOR DELETE要遵循常规 条款9:避免隐藏标准形式的NEW 条款10:如果写了OPERATOR NEW就要同时写OPERATOR DELETE 条款11:为需要动态分配内存的类声明一个...
“可以适用习惯”的司法应对:以逾期加价条款为样本.docx
医院实施ISO9001:2000条款释读与自我修正.ppt
第八讲:国际货物运输-运输条款.pptx
条款7: 当使用new得指针的容器时,切记在容器销毁前delete那些指针 条款8: 千万不要把auto_ptr放入容器中 条款9: 小心选择删除选项 条款10: 当心allocator的协定和约束 条款11: 了解自定义allocator的正统使用法...
条款7: 当使用new得指针的容器时,切记在容器销毁前delete那些指针 条款8: 千万不要把auto_ptr放入容器中 条款9: 小心选择删除选项 条款10: 当心allocator的协定和约束 条款11: 了解自定义allocator的正统使用法...
条款7:标准库的使用(或者,再论临时对象) 28 2 异常安全性相关的问题与技术 31 条款8:编写异常安全的代码——之一 32 条款9:编写异常安全的代码——之二 37 条款10:编写异常安全的代码——之三 40 条款11...
条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针 条款8:永不建立auto_ptr的容器 条款9:在删除选项中仔细选择 条款10:注意分配器的协定和约束 条款11:理解自定义分配器的正确用法 条款12...
条款27:尽量少做转型动作 minimize casting. 条款28:避免返回handles指向对象内部成分 avoid returning “handles” to object internals. 条款29:为“异常安全”而努力是值得的 strive for exception-safe code....
使容器里对象的拷贝操作轻量而正确 条款4:用empty来代替检查size()是否为0 条款5:尽量使用区间成员函数代替它们的单元素兄弟 条款6:警惕C++最令人恼怒的解析 条款7:当使用new得指针的容器时,...
原料许可证:BSD 3-条款 摘要:将文档转换为Dash.app doc2dash:为Dash.app和克隆创建文档集 ..图片:: :目标: ://doc2dash.readthedocs.io/en/stable/ badge :alt:文档状态 ..图片:: :目标: : ..图片:...
培训教材之一:06年车险条款介绍.pptx
条款7: 当使用new得指针的容器时,切记在容器销毁前delete那些指针 条款8: 千万不要把auto_ptr放入容器中 条款9: 小心选择删除选项 条款10: 当心allocator的协定和约束 条款11: 了解自定义allocator的正统使用法...
7:雇员评价管理 用户: 1:注册与登录 2:浏览服务人员信息列表,以及对详情的查看 3:在线预约 4:对服务满意度进行评价和反馈 5:在线留言以及意见反馈 6:雇员信息排行榜 7:修改密码 ——————————...
为反映出现代设计考虑,对第二版论题做了广泛的修订,包括异常(exceptions)、设计模式(design patterns)和多线程(multithreading)。 《Effective C++中文版(第3版改善程序与设计的55个具体做法)》的重要...
ROHS豁免条款:ROHS豁免项清单及ROHS最新豁免条例.pdf
公交服务采购的激励合同和质量条款:以智利圣地亚哥为例-word资料.pdf
参考资料-8. 附件七:用友云服务条款.zip
ISO9001:2015标准条款测试题参考答案.pdf