动态抛出指针不是std :: __ non_rtti_object

时间:2011-04-07 14:40:17

标签: c++ cocos2d-iphone dynamic-cast

我遇到了dynamic_cast的问题。我只是编译了我的项目并在调试模式下测试了所有东西,然后我尝试在发布模式下编译它,我已经从调试模式exept优化参数复制了每个配置,现在是/ 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,我没有足够的声誉来添加该标签!

2 个答案:

答案 0 :(得分:1)

CCNode是否有任何虚拟功能?是否所有元素都是temp-&gt; getChildren() - &gt; begin()真的是CCNodetemp->getChildren()会返回引用吗?后者特别阴险:你同时调用temp->getChildren()->begin()temp->getChildren()->end()。如果getChildren()返回副本,则您将获得一份副本的begin和另一份副本的end

答案 1 :(得分:1)

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