【问题标题】:C++ Crash on get statement?获取语​​句时 C++ 崩溃?
【发布时间】:2014-08-12 17:33:46
【问题描述】:

我遇到了一个……有趣的问题。我发现我的程序在标准 get 语句上崩溃了。对于上下文,我将覆盖 onEnter 函数(来自 Cocos2dx 框架)以在进一步场景中修改后交换图像。

我的修改如下:

图标是map< ClassA, CCSprite* >

current 属于ClassA

void onEnter(){
    <parent class>::onEnter();
    CCSprite* sprite = icons[current];
    if (sprite){
        CCNode* parent = sprite->getParent(); //Crashes Here
        if (parent){...}
    }
}

来自 Cocos2d-x:

CCNode* getParent(){
    return m_pParent;
}

注意:除了在这里之外,我在其他任何地方调用此函数都没有问题。

还有:

  1. 是的,图标存在

  2. 是的,当前存在

  3. 是的,精灵存在

  4. 当前不是指针

如果有帮助,我正在使用 QNX Momentics IDE。

编辑:: 这是一张图片

【问题讨论】:

  • 我的猜测是 spritenullptr 并因此取消引用空指针,或者由于您相对确定它不是,它可能是 delete'd 但未设置到nullptr,所以它包含垃圾。或者icons 数组中的索引从未正确设置,因此它只是在初始化时在该内存位置有任何废话。
  • @Cyber​​:由于图标的值和它的内容在场景之间没有被修改,所以它不可能被删除。我还检查了空值。我还预先设置了所有值(在构造函数中),所以我也以某种方式怀疑废话部分。我会看看它是否是一个有效的 CCSprite?
  • 请记住,C++ 没有内存安全性。可能有一些其他代码覆盖了icons 的一部分,因此sprite 指向了错误的地方。
  • 如果这是在调试或发布版本中?如果它是发布版本(或者如果启用了优化),那么调试器可能会在崩溃实际发生的位置向您撒谎。坠机地点的拆解是什么样子的?拆解永远不会说谎。

标签: c++ cocos2d-x cocos2d-x-2.x


【解决方案1】:

看起来它不是一个有效的 CCSprite。在 onEnter 的声明和调用之间,cocos2dx 使用的释放池将其标记为删除。在构造函数期间的某些情况下,CCSprite 似乎没有添加到父级,也没有标记为保留。因此,它被删除了,但仍然有一些垃圾。谢谢Cyber

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2018-05-06
    • 2013-03-26
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多