繁体   English   中英

简单SWITCH中的分段故障11

[英]Segmentation fault 11 in simple SWITCH

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类的情况下解决此问题? 谢谢。

您尚未初始化mb ; C ++不会为您做到这一点; 并且对于choice为6的情况,不会为mb分配任何值,因此稍后在将其与0进行比较时未对其进行初始化,并且可以保留任何随机值(该随机值可以为0,但在大多数情况下为0不会;它将只包含变量现在所在的内存部分中的任何值。 尝试

MyBase *mb = NULL;

在函数范围内声明变量时,它们通常称为“堆栈变量”。 这意味着它们驻留在堆栈内存中,该内存通常包含大量以前使用的“垃圾”。 因此,在声明时不初始化'mb'变量时,初始值是不确定的(无论碰巧位于堆栈中的那个位置),通常是非零的。 因此,应在声明时初始化mb:

MyBase* mb = 0;

顺便说一句,我注意到“ switch”内部的“ case 6:”没有将mb设置为任何值...

您需要将mb初始化为NULL ,否则在choice不在1..5 mb范围内的情况下将无法定义。 更改:

MyBase *mb;

至:

MyBase *mb = NULL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM