【问题标题】:dynamic cast throws pointer is not std::__non_rtti_object动态转换抛出指针不是 std::__non_rtti_object
【发布时间】:2011-04-07 14:40:17
【问题描述】:

我遇到了 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 ,我没有足够的声誉来添加该标签!

【问题讨论】:

  • 您确定在发布配置中启用了 RTTI 吗? IE。你确定你真的从调试配置中复制了 everything 吗?
  • 是的,是的。 RTTI 已启用,所有内容都从调试配置中复制
  • 在这种情况下一定是一个坏指针。错误代码可能在调试构建中运行而在发布构建中失败的原因有数百万。
  • 我再次测试,但 *l 只是它应该是它的所有参数应该是什么

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


【解决方案1】:

CCNode 有虚函数吗? temp->getChildren()->begin() 的所有元素真的是CCNodes 吗? temp-&gt;getChildren() 是否返回引用?后者特别阴险:你同时调用temp-&gt;getChildren()-&gt;begin()temp-&gt;getChildren()-&gt;end()。如果getChildren() 返回一个副本,您将获取一个副本的begin 和另一个副本的end

【讨论】:

  • 它确实有很多虚拟功能,我说的是在调试配置中如果没有调试配置也会出错!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2021-12-02
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多