有关异常处理,应在程序设计时就加入,而不是以后加入,但也有缺点:
1,使用异常会增加程序的代码,降低程序的运行速度。
2,异常规范不适用于模板,因为模板函数引发的异常可能随特定的具体化而定。
3,异常与动态内存分配并非总能协同工作。
如动态内存的例子:
void test1(int n)
{
string mesg("I'm trapped in an endless loop");
...
if (oh_no)
throw exception();
...
return;
}
string类采用动态内存分配,通常当函数结束,将为mesg调用string的析构函数。
虽然 throw 语句过早地终止了函数 ,但它仍然使得析构函数被调用,这归于栈解退。
void test2(int n)
{
double * ar = new double[n];
...
if (oh_no)
throw exception();
...
delete [] ar;
return;
}
这里,解退栈时,将删除栈中的变量ar,但函数过早的终止意味着函数末尾的delete[]语句被忽略。
指针消失 了,但它指向的内存块未被释放,并且不可访问。这说明内存被泄漏了。
避免措施一:
void test3(int n)
{
double * ar = new double[n];
try
{
if (oh_no)
throw exception();
}
catch (exception & e)
{
delete [] ar;
throw;
}
...
delete [] ar;
return;
}