0

このコードの説明を探しています。A::hello() の呼び出しは機能します (segv が必要でした)。segfault はメンバー x へのアクセスで発生するため、メソッドの解決だけでは実際に bla を逆参照していないように見えますか?

最適化をオフにしてコンパイルしました、gcc 4.6.3。bla->hello() が爆発しないのはなぜですか? 何が起こっているのだろうか。ありがとう。

class A
{

public:
    int x;

    A() { cout << "constructing a" << endl; }

    void hello()
    {
        cout << "hello a"  << endl;
    }

};

int main()
{
    A * bla;
    bla = NULL;
    bla->hello();    // prints "hello a"
    bla->x = 5;      // segfault
}
4

5 に答える 5

3

ポインタを逆参照していNULLます。つまり、 address に格納されているオブジェクトにアクセスしようとしていますNULL:

bla = NULL;
bla->hello();
bla->x = 5;

つまり、メンバーへの割り当て中のセグフォルトや、メソッドの呼び出し中の欺瞞的な「期待どおりに機能する」効果など、あらゆることが起こり得ることを意味します。5xhello

于 2013-10-16T17:03:02.123 に答える
2

理論的には、これは未定義の動作です。実際には、 をthis呼び出すときにポインターを使用しません。ポインターhello()はクラスをまったく参照しないため、機能し、メモリ アクセス違反を生成しません。ただし、そうすると、初期化されていないポインタをbla->x介してメモリを参照しようとして、クラッシュします。bla繰り返しますが、この場合でも、クラッシュするという保証はありません。これは未定義の動作です。

于 2013-10-16T17:04:41.043 に答える