0

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

4

3 に答える 3

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

于 2012-04-14T03:08:26.730 に答える
1

あなたの質問には明確化が必要です。pTest がオブジェクトへの null ポインターであり、そのオブジェクトに対してメソッドを呼び出す場合、VS2008 でコンパイルされたプログラムは、次のいずれかの場合に自動的にクラッシュすると予想されます。

  1. メソッドは仮想です
  2. メソッドはインスタンス メンバーにアクセスしようとします。

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

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

于 2012-04-14T02:36:09.107 に答える
0

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

if (pTest == NULL)
  throw std::invalid_argument("null pointer");
于 2012-04-14T02:54:26.240 に答える