简单SWITCH中的分段故障11

时间:2012-09-12 07:55:27

标签: c++

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类的情况下修复此问题? 感谢。

3 个答案:

答案 0 :(得分:2)

您尚未初始化mb; C ++不会为你做那件事;对于choice为6的情况,mb没有被赋予任何值,因此当您将其与0进行检查时,它会在以后未初始化,并且可以保留任何随机值(该随机值可以为0,但在大多数情况下它不会;它只包含现在变量的内存部分的值。 尝试

MyBase *mb = NULL;

答案 1 :(得分:2)

当你在函数范围内声明变量时,它们通常被称为“堆栈变量”。这意味着它们驻留在堆栈内存中,这通常包含许多以前使用过的“垃圾”。因此,当在声明时没有初始化'mb'变量时,初始值是未定义的(无论发生在堆栈中的那个位置上是什么),通常是非零的。 因此,您应该在声明时初始化mb:

MyBase* mb = 0;

顺便说一句,我注意到'switch'中的'case 6:'并没有将mb设置为任何东西......

答案 2 :(得分:0)

您需要将mb初始化为NULL,否则如果choice不在1..5 mb范围内,则不会定义。变化:

MyBase *mb;

为:

MyBase *mb = NULL;