3
#include <iostream>
using namespace std;

class test
{
public:
    int a,b[100];
    test() {
        cout << "Constructor called" << " \n " ;
        a=10;
    }
};

int main()
{
    test a1;    
    test *b2;      
    test *pointer = new test; 

    cout << a1.a << endl;
    cout << pointer->a << " \n ";
    cout << b2->a << " \n ";

    return 0;
}

'a1' オブジェクトと 'pointer' オブジェクト ポインターに対して、上記のコードで 2 つのオブジェクトのみが作成されるかどうかを知りたいです。ポインタ「b2」にはメモリが割り当てられていないと思います。その場合、最後の「 cout << b2->a 」でセグメンテーション違反が発生します。メモリを割り当てていない場所にアクセスしています。しかし、セグメンテーション違反は発生していません。コンパイラはランダムな値を出力するだけです。

私の質問は、「ここに 3 つのオブジェクトにメモリが割り当てられているのか、それとも 2 つだけなのか」ということです。セグメンテーション違反がないのはなぜですか?

4

2 に答える 2

4

a1自動メモリに割り当てられます。

b2はオブジェクトではなく (定義した型のオブジェクトではありません)、ポインターであり、有効な場所を指していません。これはダングリング ポインターであり、逆参照すると未定義の動作が発生します。何でも起れる。

pointer動的メモリ内のオブジェクトへのポインタです。それ自体はオブジェクトではありませんが、 によって作成されたオブジェクトを指していますnew test

ここで 3 つのオブジェクトにメモリが割り当てられているか、それとも 2 つだけですか

2つだけ。

セグメンテーション違反がないのはなぜですか?

未定義の動作は、何でも起こり得ることを意味するからです。すべての動作は標準に準拠しています。

于 2012-10-21T16:02:46.747 に答える