0
int main(){
MyBase *mb;
int choice;

cout << "Select: ";
cin >> choice;

switch (choice) {
    case 1:
        mb = new Test1();
        break;
    case 2:
        mb = new Test2();
        break;
    case 3:
        mb = new Test3();
        break;
    case 4:
        mb = new Test4();
        break;
    case 5:
        mb = new Test5();
        break;
    case 6:{
        LinkTest t;
        t.start();
        break;
    }
    default:
        return 0;
}

if(mb != 0){
    mb->start();
    delete mb;     
}

return 0;
}

選択肢が 6 の場合、mb が NULL かどうかをチェックするときにセグメンテーション違反が発生するのはなぜですか?

私はC ++が初めてで、いくつかの演習を行っています。クラスLinkTestに影響を与えずにこれを修正するにはどうすればよいですか? ありがとう。

4

3 に答える 3

2

初期化していませんmb。C++ はそれを行いません。choice6の場合はmb値が割り当てられないため、後で 0 と照合するときに初期化されず、任意のランダム値を保持できます (ランダム値は 0 になる可能性がありますが、ほとんどの場合はそうなりません)。 t be; 変数が現在あるメモリの部分にあった値が含まれます)。試す

MyBase *mb = NULL;
于 2012-09-12T07:57:16.110 に答える
2

関数スコープ内で変数を宣言する場合、それらは通常「スタック変数」と呼ばれるものです。これは、通常、以前の使用による大量の「ガベージ」を含むスタックメモリに存在することを意味します。したがって、宣言時に 'mb' 変数を初期化しない場合、初期値は未定義 (スタック内のその場所にたまたま横たわっていたもの) であり、通常はゼロではありません。したがって、宣言時に mb を初期化する必要があります。

MyBase* mb = 0;

余談ですが、「スイッチ」内の「ケース 6:」が mb を何も設定していないことに気付きました...

于 2012-09-12T07:57:41.943 に答える
0

mb を に初期化する必要がありますNULL。そうしchoiceないと、 が範囲 1..5mbにない場合、未定義になります。変化する:

MyBase *mb;

に:

MyBase *mb = NULL;
于 2012-09-12T07:57:32.113 に答える