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を指すと思いますが、can't失敗すると思います。

私は小さなアプリケーションについて話しているのではないことに注意してください。私は現在、数千のクライアントを処理し、クラッシュすることなく数週間開いたままにする必要がある 500,000 行以上の MMO サーバー アプリケーションを開発しています。防御的なプログラミングは最低限必要です。確かに、その有効性を確認せずに使用しても100%安全ですか?ptr

4

3 に答える 3

3

その関数が null ポインターを返すことは絶対にないので、それをチェックする意味はありません。null にならないことを明確にするために、参照を返す方が理にかなっています。

ただし、関数が常に有効なオブジェクトへのポインターを返すという保証はありません。静的オブジェクトのデストラクタから呼び出された場合、obj既に破棄されている可能性があります。これは、このようにシングルトン アンチパターンでラップするかどうかに関係なく、グローバルにアクセス可能なオブジェクトが非常に悪い考えである理由の 1 つです。

于 2012-10-01T02:22:18.690 に答える
2

この関数は常に、存在するオブジェクトへのポインターを返します。唯一の危険は、オブジェクト自体が無効である場合であり、これはオブジェクト コンストラクターからのスローによって示されているはずです。あなたの場合、コンストラクターから例外をキャッチしないので、その場合はプログラムを停止する必要があります。

NULL常に有効なアドレスを返すため、チェックは無意味です。

于 2012-10-01T02:21:53.433 に答える
1

ポインターのチェックを追加しても、パフォーマンスが大幅に低下することはほとんどありませんが、不要なはずです。気分が良くなる場合は追加してください。staticただし、キーワードがコンパイラによって正しく実装されているかどうかよりも、バッファ オーバーフロー、メモリ リーク、およびその他の可能性が高い問題についてより懸念します。

于 2012-10-01T02:22:59.037 に答える