2011-08-29 67 views
1

我有以下方法:嘗試{}趕上(){} C++

class MyClass 
{ 
public: 
    MyClass; 

    bool method (MyClass &obj); 
}; 

void MyClass::method (MyClass &obj) 
{ 
    MyClass *c = new MyClass; 
    try{ 
     //code 
     //access another method 
     return true; 
    } 
    catch (std::string s) 
    { 
    } 
    return false; 
} 

我應該在哪裏return true之前或return false之前刪除指針cMyClass:對象?

+2

這個問題沒有任何意義。請澄清爲什麼你創建對象'C'。它的一生如何?你需要一個指針嗎? –

+0

另外,更正發佈的代碼,當前的代碼沒有意義:類範圍中的'MyClass;'沒有意義,在類定義之後缺少';',你的語義打算做不明確... –

+0

可能重複[如何釋放內存在try-catch塊?](http://stackoverflow.com/questions/3048377/how-to-free-memory-in-try- catch-blocks) – razlebe

回答

10

什麼:

void MyClass::method (MyClass &obj) 
{ 
    MyClass c; 
    try{ 

     //code 
     //access another method 
     return true; 
    } 
    catch (std::string s) 
    { 
    } 
    return false; 
} 

沒有new - >無delete需要。當method返回時,c會自動銷燬。如果您的示例過於簡化並且您需要使用new創建c,則應該使用智能指針建議來遵循其他答案。

9

你應該使用某種形式的RAII,所以你不必爲自己刪除對象而煩惱。

使用RAII,對象本身負責釋放它所獲取的資源,而且您不必親自去做。

實施RAII的最簡單方法之一是使用Smart pointers。您可以使用unique_ptr

+4

我很確定這是中文的OP –

+0

@yi_H:我在回答中鏈接了*什麼是RAII?*問題,這更詳細地解釋了這個問題。 –

+2

當然,在這種情況下,最好只是堆疊分配「MyClass」的實例。 – Mankarse

3

簡單的答案是,您應該使用智能指針來管理內存(智能指針的選擇取決於其餘代碼),這將簡化您的代碼。實際上,您必須在退出上下文的所有代碼路徑中使用delete,其中包括兩個返回值以及可能引發的任何其他異常。

3
 
std::auto_ptr<MyClass> c(new MyClass); 
+2

'std :: unique_ptr'在這種情況下更合適,因爲'c'不會去任何地方。使用'unique_ptr'可以更清楚地說明代碼的意圖,並且可能會更有效。 – Mankarse

+1

有時我覺得我應該減少每個答案,沒有任何其他解釋或規則,或對問題的完整知識跳入'shared_ptr'。 'shared_ptr'是語言中限制性最強的智能指針之一,一旦它聲明資源的所有權,它就不能產生它,這意味着如果'code'將指針的所有權傳遞給另一個函數''shared_ptr'將仍然會刪除它,否則你將被迫(如果可以的話)改變另一個函數的接口...... @Mankarse是正確的:'unique_ptr'或甚至是舊的'auto_ptr'都是更好的默認選擇。 –

+0

@DavidRodríguez - 我使用shared_ptr與舊編譯器兼容 - 並非所有編譯器都支持C++ 0x。在這個問題的背景下,所有權沒有問題。對於C++ 0x unique_ptr是答案。 –

0

你可以在try和catch之外創建一個變量,默認設置爲false,而不是返回true。而不是返回false返回變量。

然後您可以在返回該變量之前刪除您的實例。

+0

究竟在哪裏?最好是在myClass裏面創建實例?你能發表你的想法嗎?thx – sunset