C++ -The权扔方式捕获异常
问题描述:
可能重复:
throwing exceptions of objects on the stack, mem leak with new?C++ -The权扔方式捕获异常
你扔在C++ 异常与或不的new
操作?因为这两者都会抛出异常。
void KillUnicorns()
{
throw IllegalActionException();
}
int main()
{
try
{
KillUnicorns();
}
catch (IllegalActionException e)
{
// Handle exception
}
return 0;
}
虽然下面的例子会泄漏内存吗?
void KillUnicorns()
{
throw new IllegalActionException();
}
int main()
{
try
{
KillUnicorns();
}
catch (IllegalActionException* e)
{
// Handle exception
}
return 0;
}
在C++中抛出异常的正确方法是什么?
答
我会抛出异常,而无需使用new
:
void KillUnicorns()
{
throw IllegalActionException();
}
并将catch
它与const
参考,如:
catch (const IllegalActionException & e)
{ // ^^^^ note const ^^ note reference!
}
它避免了复制。它可以避免使用new
,这样可以避免使用delete
。
答
从技术上讲,你可以同时做到这两点。
但它较传统的扔对象:
还要注意通过const引用捕捉(这可防止异常切片)
try
{
KillUnicorns();
}
catch (IllegalActionException const& e)
{ // ^^^^^^^^
// Handle exception
}
+5
+1。只需添加,通常会为异常对象留出内存。如果你做动态分配,那么你使用那个内存作为指针,但仍然尝试使用bog标准的动态分配(如果你的实现使用了一个,那么在“堆上”)。如果例外的原因是你内存不足,这是...不是很好。当然,你也为自己创造了一个混乱。稍后释放该内存。 – 2011-04-03 16:03:31
一个简单的问题可以得到解决。 'const IllegalActionException&e'是否达到与'IllegalActionException const&e'相同的结果?正如@马丁的评论所见。 – Kevin 2011-04-03 16:02:42
@ Kevin:前缀或postfing到一个类型是一个风格问题(你可以看到周围)。结果是相同的。 – 2011-04-03 16:23:45