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 是;它将只包含变量现在所在的内存部分中的任何值)。尝试

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

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

MyBase* mb = 0;

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

于 2012-09-12T07:57:41.943 回答
0

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

MyBase *mb;

到:

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