2012-10-01 54 views
1
class A 
{ 
private: 
    A(){}; 
    ~A(){}; 
public: 
    static A* GetInstance(void) 
    { 
     static A obj; 
     return& obj; 
    } 
}; 

,我假設如果事情bad情況只會在第一次發生,因爲在類的構造函數只初始化首次GetInstance一個調用發生,我不知道C的大深度++,我不信任C++,所以當我需要一個指向這個類,將在函數中使用很多次,我目前做:我是否曾經需要檢查此方法的指針有效性?

A* ptr = A::GetInstance(); 
if(ptr) 
{ 

檢查指針的有效性,我相信該方法返回的地址其中存儲obj的值以便ptr將指向它,whi我想它can't失敗。

請注意,我不是在談論一個小應用程序,我目前正在開發一個500,000多線MMO服務器應用程序,它可以處理數千個客戶端,並且必須保持打開數週而不會崩潰,防禦性編程是最少的最低要求。是否對確定,100%可安全使用ptr而不檢查其有效性?

+3

'我不相信C++'的恥辱......相信語言,熱愛語言。 – Mike

+2

@Mike:當涉及到管理靜態對象的生命週期時,他不信任C++。這充滿了隱患。 –

+0

如果您不信任該語言以在需要時爲您提供有效指針,那麼您是否真的相信它能夠正確檢查指針是否有效? –

回答

3

該函數永遠不會返回空指針,所以沒有辦法檢查它。返回一個引用可能會更有意義,說明它不會爲空。

但是,不能保證該函數將始終返回指向有效對象的指針。如果它是從靜態對象的析構函數調用的,那麼obj可能已經被銷燬。這就是全局訪問對象是一個非常糟糕的主意的原因之一,不管你是否像這樣將它們包裝在Singleton反模式中。

+0

嗨邁克,關於返回引用的問題是,如果解構器是私人的,你不能'A ref = A :: GetInstance()',假設該方法是'A&GetInstance(){static一個obj;返回obj; }' –

+1

@ViniyoShouta:不,但是你可以做'A&ref = A :: GetInstance();' –

+0

哦,是的+1,我錯誤地使用了引用返回值。 –

2

該函數將始終返回一個指向存在的對象的指針。唯一的危險是如果對象本身是無效的,並且這應該由來自對象構造函數的throw指示。在你的情況下,你不會從構造函數中捕獲異常,所以程序應該停止,否則應該很好。

檢查NULL是毫無意義的,因爲您總是返回一個有效的地址。

1

添加對指針的檢查不會導致顯着的性能下降,但應該是不必要的。如果它能讓你感覺更好,就加入它。不過,我會更關心緩衝區溢出,內存泄漏以及其他更可能出現的問題,而不是編譯器是否正確實現了static關鍵字。

相關問題