异常安全性问题
- 异常安全代码
在出现异常的情况下仍然能够正确运行- 异常中立
将所有的异常都转发给调用者- 永远不要在析构函数、重载运算符函数operator delete()或者operator delete[]中抛出异常
在编写析构函数和内存释放函数时,要假设存在throw()这样的异常规范
以template < typename T > class Stack为例
template <typename T>
class Stack
{
public:
Stack();
~Stack();
Stack( const Stack & );
Stack & operator=( const Stack & );
size_t Count() const { return vused_; }
void Push( const T& t );
T & Top()
{
if ( 0 == vused_ )
{
throw "empty stack";
}
return v_[vused_-1];
}
void Pop()
{
if ( 0 == vused_ )
{
throw "pop from empty stack";
}
else
{
-- vused_;
}
}
private:
T *NewCopy( const T *src,
size_t srcsize,
size_t destsize );
T * v_;
size_t vsize_;
size_t vused_;
};
默认构造过程
template <typename T>
Stack<T>::Stack()
: v_( new T[10] ),
vsize_( 10 ),
vused_( 0 )
{
}
析构过程
template <typename T>
Stack<T>::~Stack()
{
delete[] v_;
}
辅助函数
template <typename T>
T *Stack<T>::NewCopy( const T *src, size_t srcsize, size_t destsize )
{
assert( destsize >= srcsize );
T *dest = new T[destsize];
try
{
copy( src,