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;
}