第十八章 18.1.3节练习 & 18.1.4节练习

练习18.7

根据第16章的介绍定义你自己的Blob和BlobPtr,注意将构造函数写成函数try语句块。

解答:

这里可以参考书中的实现,为之前实现的Blob和BolbPtr类的构造函数添加try语句块。

template

Blob::Blob(std::initializer_list il) try: data(std::make_share>(il)){  

 // 函数体

} catch (const std::bad_alloc &e){handle_out_of_memory(e);}


练习18.8

回顾你之前编写的个各类,为他们的构造函数和析构函数添加正确的异常说明。如果你认为某个析构函数可能抛出异常,尝试修改代码是的改析构函数不会抛出异常。

解答:

这里需要注意一下为什么析构函数不能抛出异常的问题。

因为析构函数本来就是异常处理的一个环节,如果在析构函数中再出现异常会使得情况变得更加复杂,更加难以处理。


more effective c++提出两点理由(析构函数不能抛出异常的理由):

1)如果析构函数抛出异常,则异常点之后的程序不会执行,如果析构函数在异常点之后执行了某些必要的动作比如释放某些资源,则这些动作不会执行,会造成诸如资源泄漏的问题。

2)通常异常发生时,c++的机制会调用已经构造对象的析构函数来释放资源,此时若析构函数本身也抛出异常,则前一个异常尚未处理,又有新的异常,会造成程序崩溃的问题。

参考:http://col1.blog.163.com/blog/static/1909775192012712102940965/

你可能感兴趣的:(C++,primer,5ed)