C++ 动态_cast使我的程序崩溃
在我的程序中,我有一个基类(C++ 动态_cast使我的程序崩溃,c++,crash,dynamic-cast,C++,Crash,Dynamic Cast,在我的程序中,我有一个基类(ship)和四个派生类(pirate,mercantile,repairing,exploring)在repairing的成员函数中,我想知道ship*指向的对象是否属于pirate类型,以便能够处理该情况 因此,在该成员函数中,我有以下if: ship * shp; shp = map[i][j]->getShip(); //random initialization of shp if( (dynamic_cast<pirate *>(shp
ship
)和四个派生类(pirate
,mercantile
,repairing
,exploring
)在repairing
的成员函数中,我想知道ship*
指向的对象是否属于pirate
类型,以便能够处理该情况
因此,在该成员函数中,我有以下if
:
ship * shp;
shp = map[i][j]->getShip(); //random initialization of shp
if( (dynamic_cast<pirate *>(shp)) == NULL) // <- program doesn't enter here
{ . . . } // while it should
但在编译并尝试运行此程序后,程序在使用dynamic\u cast
时崩溃
因此,可能dynamic\u cast
工作不正常,这就是它没有在上一个代码中输入if
的原因
请注意,我在程序的其余部分使用了与dynamic\u cast
相同的方法来找出对象的类型,并且它工作正常
为什么会这样
提前感谢。正如您已经发现的,原因不是初始化
发货。更基本的是,dynamic_cast(baseptr)
要求baseptr
必须指向活动的Base
对象或是nullptr
。例如,如果指针已初始化,但对象随后被删除,则该操作也将不起作用。可能性:如果您在第一条if语句中,则表示转换失败,并且shp可能正在查找某个无效值。因此,第二次尝试动态转换shp(可能处于无效状态)将导致崩溃。您需要发布更多的代码以进一步澄清。map[i][j]->getShip()
您是否100%确定i和j是有效的,并且没有超出map的范围?我假设map是一个2d数组。我不建议将变量命名为标准类(map
)。请注意,我在程序的其余部分使用了与dynamic_cast相同的方法来找出对象的类型,它工作正常
我们不知道什么是map
。我们不知道i
或j
的值。如果您发布了map
的内容,以及当您的程序崩溃时i
和j
的具体值,这不是更有帮助吗?
pirate *prt;
bool test;
if(map[i][j]->getShip()!=0){
prt = dynamic_cast<pirate *>(shp); // <- program crashes here
test = ( prt == NULL );
cout<<test<<endl;
}