C++ 无法从错误进行调试,但代码中没有错误

C++ Cannot debug from errors, but no errors in code

本文关键字:代码 有错误 调试 错误 C++      更新时间:2023-10-16

我正在尝试"删除"/杀死我的实体,如果它们超出"游戏区"或至少用户可见的内容。我没有收到任何错误,但是当我在函数"killEdgeEntities"中尝试此代码示例并启动游戏时,一切都已经死了,就好像"if 语句"直接执行一样。不,我没有在争论之外产生任何东西。例如,用户 Ship 在屏幕中间生成。

如果你们需要更多信息,请发表评论。

void Invaders::killEdgeEntities() {
EntityVector entities;
for (EntityVector::iterator j = mEntities.begin(); j != mEntities.end(); j++) {
    Entity *entity = *j;
    //  * Dödsgränser *
    // Vänster: 
    if (entity->getPosition().getX() < -20) {
        delete entity;
    }
    // Höger: 
    if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) {
        delete entity;
    }
    // Upp: 
    if (entity->getPosition().getY() < -80) {
        delete entity;
    }
    // Ner: 
    if (entity->getPosition().getY() >  VGCDisplay::getHeight() + 20) {
        delete entity;
    }
}
mEntities = entities;
}

不是真正的答案 - 因为您没有发布足够的代码让我们弄清楚发生了什么......但是您已经发布了足够多的内容来查看问题。

if (entity->getPosition().getX() < -20) {
    delete entity;
}
// Höger: 
if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) {

当您的 x <-20 并删除实体时会发生什么? 您尝试在下一行访问它,该行现在是一个浮动指针(即它不指向有效内存)......以及等待发生的崩溃。

这解决了我的问题,通过在最后对实体进行push_back到实体矢量"实体"的 else 批处理。最后在 for 循环之后确保它们是内联的(我猜是并行的)。

void Invaders::killEdgeEntities() {
    EntityVector entities;
    for (EntityVector::iterator i = mEntities.begin(); i != mEntities.end(); i++) {
        Entity *entity = *i;
        //  * Dödsgränser *
        // Vänster: 
        if (entity->getPosition().getX() < -20) {
            delete entity;
        }
        // Höger: 
        else if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) {
            delete entity;
        }
        // Upp: 
        else if (entity->getPosition().getY() < -80) {
            delete entity;
        }
        // Ner: 
        else if (entity->getPosition().getY() > VGCDisplay::getHeight() + 20) {
            delete entity;
        }
        else {
            entities.push_back(entity);
        }
    }
    mEntities = entities;
}