2012-07-18 98 views
1

假設有一個析構函數的對象爲:在析構函數中調用函數是一種很好的做法嗎?

anObject::~anObject() 
{ 
    _functionCalledfromDestructor=1; //this sets the flag = 1 
    functionCall(); //this function does something different than usual 
        //on seeing the flag 
} 

我的問題:

是在析構函數編碼一個很好的做法的這種風格/方法?

+3

一定'functionCall'不拋出異常! – ildjarn 2012-07-18 19:13:02

回答

10

這樣的「隱藏頻道」總是一個壞主意。函數的行爲不應該依賴於不可見狀態。你可以給函數一個參數,然後在析構函數中傳遞一個值,在其他地方傳遞另一個值。如果您願意,您可以使用更常見情況下的默認值。

7

這種風格/編碼方法在析構函數中是一種很好的做法嗎?

如果函數兩個不同的東西不同的地方它是從所謂的,那麼你有兩個功能,而不是一個。使兩個功能實際上是兩個功能,你不需要問這個問題。

+0

它不會做完全不同的事情 - 它只是在兩個案例中的每一箇中向寄存器寫入不同的位。 – armundle 2012-07-18 19:09:31

+8

@armundle大多數人會在使用全局變量的地方使用參數。 – 2012-07-18 19:10:14

4

一般來說,沒有。我認爲你最好做這樣的事情:

class anObject 
{ 
private: 
    void doSomethingInternal(bool fromDestructor) {...} 
public: 
    void doSomething() {doSomethingInternal(false);}; 
    virtual ~anObject() { doSomethingInternal(true); }; 
} 
0

調用函數內部的析構函數通常不被認爲是一個很好的做法 ,因爲是拋出一個異常的可能性。此 導致未正確清理內存,並且析構函數中異常 的行爲未定義。

這裏有更多有關在析構函數拋出異常:

SP on throwing in the destructor

在你的情況,一個定義良好的通過公共接口 清理是一個整體更好的方式去。例如,您可以提供執行清理的方法Dispose

考慮類似如下(在僞代碼):

public: 
    void Dispose() 
    { 
     bool isDestructing = true; 
     functionCall(isDestructing); 
    } 
+2

只要函數具有nothrow保證,就可以從析構函數調用函數。另一方面,在銷燬之前需要明確執行清理是一種不好的做法(儘管'std :: thread'會這樣做),畢竟在清理異常期間不會調用這個清理。 – avakar 2012-07-18 19:31:28

相關問題