【问题标题】:Segfault when trying to access header declared member尝试访问标头声明的成员时出现段错误
【发布时间】:2017-05-18 07:07:20
【问题描述】:

我有一个 Cocos2d-x 3.14 项目,我正在尝试迁移到 3.15,它适用于 iOS,但不适用于 Android。 3.14 两者都可以正常工作。

在运行 3.15 迁移版本时,在访问使用 this->member 在标头中声明的成员时出现段错误。如果我添加局部变量,它工作正常。

Hpp 文件:

class GameBoard : public Layer
{
public:

    static cocos2d::Scene* createScene();
    virtual bool init();
    CREATE_FUNC(GameBoard);

    // background
    Sprite* background;
    void setupBackGround();

    ...
}

Cpp 文件:

void GameBoard::setupBackground() {

    cocos2d::Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    if (this->background == NULL) {
         doStuff();
    }
}

“this->background”行崩溃。有谁知道为什么会发生这种情况?

【问题讨论】:

  • 我认为它没有在 this->background 上崩溃。我猜它在 doStuff 上崩溃了,它可能会访问未初始化的背景。
  • 当时this 是否指向某个正确实例化的实例?
  • 或者,您是否在已删除的 GameBoard 对象上调用 GameBoard::setupBackground?
  • @user1438832 它专门在那条线上崩溃了。该引擎允许您使用函数 Sprite::create("mySprite.png"); 初始化未初始化的精灵指针。通过一些额外的测试,它仅在检查 null 的成员变量上崩溃。
  • @πάνταῥεῖ 通常 cocos2d-x 管理 GameBoard 类的初始化。 'this' 绝对不是 NULL。但是您确实给了我在示例项目(仅使用局部变量)中尝试相同操作(访问成员)的想法

标签: android c++ cocos2d-x cocos2d-x-3.0


【解决方案1】:

事实证明,在 Cocos2d-x 3.15(至少在我们的项目中)中,“applicationResized”函数在场景初始化之前被调用。再加上在这个 applicationResized 函数的 NULL 检查中使用的指针实际上都没有被初始化为 NULL,如果检查通过,这会导致错误。

从这个意义上说,@πάνταῥεῖ 是正确的,“this”(游戏板)当时没有正确实例化,而是指向随机内存。

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多