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