2012-04-14 15 views
0

私はpTestという名前のポインタを持っています。ポインターを使用して関数が呼び出された場合、アプリケーションをただちにクラッシュさせることは可能ですか?NULLポインタの呼び出しがすぐに失敗する

+0

'pTest'は何にNULLポインタのですか?関数ポインタか、引数として渡しているのでしょうか?後者の場合、関数内で 'if(pTest == NULL)abort()'のようなことをすることができます。 –

+0

@KeithThompsonもしそれが前者なら、それはそれ自身で爆破するはずです。 – jpm

+0

@jpm:* *する必要がありますが、保証されていません。 –

答えて

4

生ポインタを使用する代わりに、逆参照をトラップする保護ポインタクラス(スマートポインタの形式)を作成できます。

#include <stdexcept> 

template<typename T> 
class CheckedPointer 
{ 
    T * ptr; 
public: 
    CheckedPointer(T * init = NULL) : ptr(init) {} 
    T * operator->() const 
    { 
     if (ptr == NULL) 
      throw std::runtime_error("dereference of NULL pointer"); 
     return ptr; 
    } 
    T & operator*() const 
    { 
     if (ptr == NULL) 
      throw std::runtime_error("dereference of NULL pointer"); 
     return *ptr; 
    } 
    // ... more members to make this a useful class 
}; 

class Test 
{ 
public: 
    void Foo() {} 
}; 

int main() 
{ 
    CheckedPointer<Test> pTest; 
    pTest->Foo(); 
} 

http://ideone.com/R4mUK

1

あなたの質問には明確化が必要です。メソッドは、メソッドの試行

  • 仮想です

    1. :PTESTは、オブジェクトへのNULLポインタであり、あなたはそれのメソッドを呼び出す場合はいずれかの場合には、その後、私はあなたのVS2008は、独自にクラッシュするプログラムをコンパイル期待します

    これは、意味的に静的でインスタンスメンバーにアクセスしようとしない場合、メソッド呼び出しが実際に動作する可能性があることを意味します。さらに、この種の動作は、デバッグとリリースのビルドによって異なります。

    の場合は、メソッドの呼び出しの前/直後にアプリケーションをクラッシュさせたい場合、それぞれの前にアサーションまたは条件付きアボートを追加できます。または、各メソッドの先頭に(この== NULL)チェックを追加することもできます(ただし、この時点までにクラッシュを引き起こす仮想メソッドでは機能しません)。

    0

    例外をスローし、決してそれをキャッチしたくない場合があります。それはあなたのプログラムをクラッシュさせます。

    if (pTest == NULL) 
        throw std::invalid_argument("null pointer"); 
    
    関連する問題