0
点赞
收藏
分享

微信扫一扫

C++ 异常处理(四) 有关异常处理的注意事项


有关异常处理,应在程序设计时就加入,而不是以后加入,但也有缺点:

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;
}


另一种方法:使用智能指针。


举报

相关推荐

0 条评论