2011-04-03 27 views
8

可能重複:
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++中拋出異常的正確方法是什麼?

回答

9

我會拋出異常,而無需使用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

8

從技術上講,你可以同時做到這兩點。

但它較傳統的扔對象:
還要注意通過const引用捕捉(這可防止異常切片)

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

+1。只需添加,通常會爲異常對象留出內存。如果你做動態分配,那麼你使用那個內存作爲指針,但仍然嘗試使用bog標準的動態分配(如果你的實現使用了一個,那麼在「堆上」)。如果例外的原因是你內存不足,這是...不是很好。當然,你也爲自己創造了一個混亂。稍後釋放該內存。 – 2011-04-03 16:03:31