2010-01-24 26 views
2

我有這樣的事情:這是內存泄漏嗎?應該怎麼做?

void Test(void) 
{ 
    char errorMessage[256]; 

    spintf(errorMessage,... blablabla); 
    throw new CustomException(errorMessage); 
} 

這會不會造成內存泄漏的errorMessage因爲將不被釋放?或者當在try {} catch中訪問異常的消息時,這會導致異常,因爲errorMessage在從函數出去時已經被釋放了。

在此先感謝。

+2

什麼是CustomException構造函數的定義?您的問題的答案取決於是否複製errorMessage字符串。 – mcdave 2010-01-24 12:55:10

+0

錯誤字符串未被複制 – 2010-01-24 13:07:13

回答

7

errorMessage的內存在被catch處理程序訪問時已經被釋放。但是,您可以將其複製到std::stringCustomException的構造函數中。

另一方面,內存泄漏可能是由異常本身引起的,因爲您將它放在堆上。這不是必需的。

0

它不會導致內存泄漏,但可能導致未定義的行爲,具體取決於您對該異常所做的操作。我想內存泄漏只能發生在你分配動態內存時

7

答案是肯定的,很可能。你永遠不應該拋出使用new創建的對象。使用常量引用

throw CustomException(errorMessage); 

和catch:相反,扔值

try { 
    ... 
} 
catch(const CustomException & e) { 
    ... 
} 

投擲值意味着編譯器處理拋出的對象的生命週期。另外,在你的代碼中,如果你的異常類的拷貝構造函數不正確,你可能會遇到另一個問題 - 然而,這與異常處理沒有任何關係。

+0

同意。拋出值,捕獲引用,你會沒事的。投擲指針是很容易出錯的,因爲你需要約定誰應該釋放它們,並且引入了邊緣情況,例如如果有人想重新拋出一個被發現的異常,會發生什麼? – MarkR 2010-01-24 13:02:27

+0

我已經死了,通過const引用的東西來捕獲。您應該通過'reference'來捕獲,但不一定是'const',因爲您可能希望修改異常(添加精度),然後重新拋出。 – 2010-01-24 13:11:26

+0

@Matthieu那麼,你可能只是一小部分人。大多數人不想修改異常,所以使用const是非常有意義的。 – 2010-01-24 13:17:04