GotW #08 CHALLENGE EDITION Exception Safety
著者:Herb Sutter
翻译:kingofark
[声明]:本文内容取自www.gotw.ca网站上的Guru of the Week栏目,其著作权归原著者本人所有。译者kingofark在未经原著者本人同意的情况下翻译本文。本翻译内容仅供自学和参考用,请所有阅读过本文的人不要擅自转载、传播本翻译内容;下载本翻译内容的人请在阅读浏览后,立即删除其备份。译者kingofark对违反上述两条原则的人不负任何责任。特此声明。
Revision 1.0
Guru of the Week 条款08:GotW挑战篇——异常处理的安全性
难度:9 / 10
(异常处理机制是解决某些问题的上佳办法,但同时它也引入了许多隐藏的控制流程;有时候,要正确无误的使用它并不容易。不妨试试自己实现一个简单的container(这是一种可以对其进行push和pop操作的栈),看看它在异常-安全的(exception-safe)和异常-中立的(exception-neutral)情况下,到底会发生哪些事情。)
[问题]
1. 实现如下异常-中立的(exception-neutral)container。要求:Stack对象的状态必须保持其一致性(consistent);即使有内部操作抛出异常,Stack对象也必须是可析构的(destructible);T的异常必须能够传递到其调用者那里。
template <class T>
// T 必须有缺省的构造函数和拷贝构造函数
class Stack
{
public:
Stack();
~Stack();
Stack(const Stack&);
Stack& operator=(const Stack&);
unsigned Count(); // 返回T在栈里面的数目
void Push(const T&);
T Pop(); // 如果为空,则返回缺省构造出来的T
private:
T* v_; // 指向一个用于'vsize_' T对象的
// 足够大的内存空间
unsigned vsize_; // 'v_' 区域的大小
unsigned vused_; // 'v_' 区域中实际使用的T的数目
};
附加题:
2. 根据当前的C++标准,标准库中的container是异常-安全的(exception-safe)还是异常-中立的(exception-neutral)?
3. 应该让container成为异常-中立的(exception-neutral)吗?为什么?有什么折衷方案吗?
4. Container应该使用异常规则吗?比如,我们到底应不应该作诸如“Stack::Stack()throw(bad_alloc);”的声明?
挑战极限的问题:
5. 由于在目前许多的编译器中使用try和catch会给你的程序带来一些额外的负荷,所以在我们这种低级的可复用(reusable)Container中,最好避免使用它们。你能在不使用try