动态强制转换抛出的指针不是std::__non_rtti_object

dynamic cast throws pointer is not std::__non_rtti_object

本文关键字:std non object rtti 指针 转换 动态      更新时间:2023-10-16

我对dynamic_cast有问题。我刚刚编译了我的项目,并在调试模式下测试了所有的东西,然后我尝试在发布模式下编译它,我已经从调试模式复制了每个配置,除了优化参数现在是/o2,(在调试时我将其设置为/od)项目编译,但当它开始加载我的资源时,我在这里的代码段中得到了异常:

for(int j = 1; j < i->second->getParametersNumber();j++)
{
    CCTMXTiledMap* temp = CCTMXTiledMap::tiledMapWithTMXFile(i->second->As<string>(j).c_str());
    CCTMXLayer* ret = NULL;
    for(NSMutableArray<CCNode*>::NSMutableArrayIterator l=temp->getChildren()->begin();!ret && l!=temp->getChildren()->end();l++)
        ret = dynamic_cast<CCTMXLayer*> (*l);
    t1.first = ret;
    templates[i->first].second.push_back(t1);
    templates[i->first].second.back().first->retain();
}

代码中没有任何变化,当我在调试器中检查类中的每个变量时,它应该是什么,但动态强制转换是抛出std::__non_rtti_object。我做错了什么?我使用的是cocos2d-x,我没有足够的声誉来添加这个标签!

CCNode是否有虚函数?所有的元素temp->getChildren()->begin()真的是CCNode s吗?temp->getChildren()是否返回引用?后者尤其阴险:您同时调用temp->getChildren()->begin()temp->getChildren()->end()。如果getChildren()返回一个副本,则取一个副本的begin和另一个副本的end

在这种情况下,经过许多代码更改后,我发现必须有一些bug在代码优化时显示自己(仍然不知道它是编译器的错误优化还是我的代码有一些问题,但它可能是我的)。这个问题的主要原因是*l为NULL。