gpt4 book ai didi

c++ - 子对象(看似)随机设置为 NULL 或 'illegal object' ;如何调试?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:55 26 4
gpt4 key购买 nike

我将 Cocos2d-x 用于我从 Cocos2d-iphone 移植的游戏。最初的程序员似乎使用了 Objective-C 的“特性”来避免在调用 nil 对象时崩溃,以此来做很多草率的事情。

如果这与我不知道的相关,但是,在我的代码中,我从不手动调用 release() ,当然也不会删除或类似的东西。我什至根本不调用 ->removeObject() (尽管这不会导致与我遇到的问题相同)。

现在的问题是:当游戏运行时,在随机时刻(它们不会是随机的,但它们现在显然是随机的)子节点被设置为 NULL。这不仅会影响我的代码,还会影响 Cocos2d 的内部结构。示例:

    CCLog("----------------");
for(int j = 0; j < this->getChildren()->count(); j++)
{
CCObject *child = this->getChildren()->objectAtIndex(j);
EnemySprite *enemy = dynamic_cast<EnemySprite*>(child);
if (enemy != NULL) {
CCLog("Enemy with tag %d found", enemy->getTag());
}
}
EnemySprite *enemy = dynamic_cast<EnemySprite*>(this->getChildByTag(i));
if (enemy == NULL) {

CCLog("Now enemy with %d is NULL :(", i);
}

在 getChildren() 中,所有带有标签的敌人都在那里并打印出来;

  • 找到标记为 1000 的敌人
  • 找到标记为 1001 的敌人
  • 找到标记为 1002 的敌人

在游戏过程中它会显示很多次,直到它显示为止;

  • 找到标记为 1000 的敌人
  • 找到标记为 1001 的敌人
  • 找到标记为 1002 的敌人
  • 现在有 1001 的敌人是 NULL :(

然后崩溃。

在我看来,上面的代码应该是不可能的,因为我刚刚检查、验证并准确地打印了那个对象......

但更有趣的是(也许只对我而言,也许这是一些愚蠢的错误),这个

 this->getChildByTag(i)

内部也会随机出错;遍历 child ,它会找到一个 NULL 并在 Cocos2d 内部代码上找到:

        if(pNode && pNode->m_nTag == aTag)
return pNode;

然后 pNode 不为 NULL(这就是断言不触发的原因)但看起来像这样:

http://o7.no/137JXC4 (截图)

在这个项目中,cocos2d::CCCopying 对我来说已经是噩梦了;每次我看到它,我就知道出了什么问题,但我不知道如何找到它。

我已经在 release() 删除行添加了一个断点;它没有被调用。而我,就像我说的,不会手动做任何类似的事情。

我使用 Xcode/iOS 进行调试,但行为在 Android 上是相同的(但在我的计算机上,Eclipse 比 Xcode 慢,尤其是在调试期间)。

我知道很难给我一个解决方案/原因,但是;如果有人能告诉我如何解决这个问题,我会很高兴。它在整个(相当大的)代码库中随机发生,我不知道如何找到这个问题......

希望有人能帮忙!

最佳答案

有时 dynamic_cast 返回 0,即使它的参数不为 0。例如,当您将父类(super class)转换为子类时(所谓的“向下转换”),就会发生这种情况。查看本教程以获取更多信息:http://www.cplusplus.com/doc/tutorial/typecasting/

我可以想象,如果您的列表中的元素具有通用(不相关)父类(super class)型,那么这可能就是您遇到的问题。

关于c++ - 子对象(看似)随机设置为 NULL 或 'illegal object' ;如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16375213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com