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

+1

一个简单的问题可以得到解决。 'const IllegalActionException&e'是否达到与'IllegalActionException const&e'相同的结果?正如@马丁的评论所见。 – Kevin 2011-04-03 16:02:42

+2

@ Kevin:前缀或postfing到一个类型是一个风格问题(你可以看到周围)。结果是相同的。 – 2011-04-03 16:23:45

从技术上讲,你可以同时做到这两点。

但它较传统的扔对象:
还要注意通过const引用捕捉(这可防止异常切片)

try 
{ 
    KillUnicorns(); 
} 
catch (IllegalActionException const& e) 
{       // ^^^^^^^^ 
    // Handle exception 
} 
+5

+1。只需添加,通常会为异常对象留出内存。如果你做动态分配,那么你使用那个内存作为指针,但仍然尝试使用bog标准的动态分配(如果你的实现使用了一个,那么在“堆上”)。如果例外的原因是你内存不足,这是...不是很好。当然,你也为自己创造了一个混乱。稍后释放该内存。 – 2011-04-03 16:03:31