Dimpik
@Dimpik

После закрытия скомпилированной программы появляется ошибка Debug Assertion Failed?

Вот данное окно : 60823c3bd3381340936272.png

Вот ошибка под Debug
60823ce854a42658693267.png
View.cpp :

#include "view.h"
#include "player.h"

#include <QObject>
#include <QTimer>
#include <QtGlobal>

View::View()
{

    setWindowTitle("Space Rangers");

    setRenderHint(QPainter::Antialiasing);

    setFrameStyle(0);
    setSceneRect(0, 0, 700,700);
    setFixedSize(700, 700);


    mainScene.setItemIndexMethod(QGraphicsScene::NoIndex);
    setScene(&mainScene);

    connect(&pl, &Player::IS_IT_Attack, this, &View::PlayerAttack);

    startGame = new QTimer(this);
    connect(startGame, &QTimer::timeout, &pl, &Player::actions);
    startGame->start(1000 / 50);
    view_elements();

    create_type1_enemy = new QTimer(this);
    connect(create_type1_enemy, &QTimer::timeout, this, &View::addType1Enemy);
    create_type1_enemy->start(8000);

    reload_virusmove = new QTimer(this);
    connect(reload_virusmove, &QTimer::timeout, this, &View::virusMov);

    T1_Enemy_Attack = new QTimer(this);
    connect(T1_Enemy_Attack, &QTimer::timeout, this, &View::Type1_EnemyAttack);

    T1_Enemy_bulletmove = new QTimer(this);
    connect(T1_Enemy_bulletmove, &QTimer::timeout, this, &View::T1_E_BulletMov);

    player_bulletmove = new QTimer(this);
    connect(player_bulletmove, &QTimer::timeout, this, &View::p_bulletMov);

    create_reload_Virus = new QTimer(this);
    connect(create_reload_Virus, &QTimer::timeout, this, &View::addVirus);
    create_reload_Virus->start(30000);

}

void View::view_elements(){

    pl.setPos(205, 400);
    mainScene.addItem(&pl);
}

void View::addVirus(){

    reload_Virus *virus = new reload_Virus();
    r_vir = new reload_Virus();
    r_vir = virus;
    virus->x = rand() % 630;
    mainScene.addItem(virus);
    virus->setPos(r_vir->x, r_vir->y);
    Viruses.append(virus);
    viruspodMoving(virus);

}

void View::delete_reload_Virus(QGraphicsItem *virus){

    foreach(reload_Virus *v, Viruses){
        if(v == virus){
            mainScene.removeItem(v);
            Viruses.removeOne(v);
            delete virus;
            r_vir->y = -70;
            r_vir->x = 0;
        }
    }
}

void View::viruspodMoving(QGraphicsItem *virus){

    if(r_vir->y < 700){
        reload_virusmove->start(40);
    }

    else{
        reload_virusmove->stop();
        delete_reload_Virus(virus);
    }

}

void View::virusMov(){

    if(r_vir->y < 700){
        r_vir->y = r_vir->y + 3;
        r_vir->setPos(r_vir->x, r_vir->y);
        viruspodMoving(r_vir);
  }
}

void View::PlayerAttack(){

    player_bullet = new p_LaserBullet();
    player_bullet2 = new p_LaserBullet();

    player_bullet->x = pl.x + 46;
    player_bullet->y = pl.y - 33;

    player_bullet2->x = pl.x + 28;
    player_bullet2->y = pl.y - 33;

    player_bullet->setPos(player_bullet->x, player_bullet->y);
    mainScene.addItem(player_bullet);

    player_bullet2->setPos(player_bullet2->x, player_bullet2->y);
    mainScene.addItem(player_bullet2);

    p_Bullets.append(player_bullet);
    p_Bullets.append(player_bullet2);

    p_bulletpodMoving(player_bullet, player_bullet2);
}

void View::p_bulletpodMoving(QGraphicsItem *bullet_1, QGraphicsItem *bullet_2){

    if(player_bullet->y + 5 > 3 && player_bullet2->y + 5 > 3){
        player_bulletmove->start(20);
    }

    else {
        player_bulletmove->stop();
        delete_player_bullet(bullet_1, bullet_2);
    }
}

void View::p_bulletMov(){

    if(player_bullet->y + 5 > 3 && player_bullet2->y + 5 > 3){
        player_bullet->y = player_bullet->y - 5;
        player_bullet2->y = player_bullet2->y - 5;
        player_bullet->setPos(player_bullet->x, player_bullet->y);
        player_bullet2->setPos(player_bullet2->x, player_bullet2->y);
        p_bulletpodMoving(player_bullet, player_bullet2);
    }
}

void View::delete_player_bullet(QGraphicsItem *bullet1, QGraphicsItem *bullet2){

    foreach(QGraphicsItem *b, p_Bullets){
        if(b == bullet1){
            mainScene.removeItem(b);
            delete bullet1;
            p_Bullets.removeOne(b);
            player_bullet->y = 0;
        }
    }

    foreach(QGraphicsItem *b, p_Bullets){
        if(b == bullet2){
            mainScene.removeItem(b);
            delete bullet2;
            p_Bullets.removeOne(b);
            player_bullet2->y = 0;
        }
    }
}

void View::addType1Enemy(){

    Type1_Enemy *enemy_1type = new Type1_Enemy();
    enemy_1type->setPos(enemy_1type->x, enemy_1type->y);
    mainScene.addItem(enemy_1type);
    T1_Enemy_Attack->start(1000);
}

void View::Type1_EnemyAttack(){

    T1_Enemy_bullet = new Type1_EnemyBullet();
    T1_Enemy_bullet2 = new Type1_EnemyBullet();

    T1_Enemy_bullet->x = Type1_Enemy_res->x + 20;
    T1_Enemy_bullet->y = Type1_Enemy_res->y + 105;
    T1_Enemy_bullet->setPos(T1_Enemy_bullet->x, T1_Enemy_bullet->y);

    T1_Enemy_bullet2->x = Type1_Enemy_res->x + 40;
    T1_Enemy_bullet2->y = Type1_Enemy_res->y + 105;
    T1_Enemy_bullet2->setPos(T1_Enemy_bullet2->x, T1_Enemy_bullet2->y);

    mainScene.addItem(T1_Enemy_bullet);
    mainScene.addItem(T1_Enemy_bullet2);

    e1_Bullets.append(T1_Enemy_bullet);
    e1_Bullets.append(T1_Enemy_bullet2);

    T1_E_bulletpodMoving(T1_Enemy_bullet, T1_Enemy_bullet2);

}

void View::T1_E_bulletpodMoving(QGraphicsItem *bullet_1, QGraphicsItem *bullet_2){

    if(T1_Enemy_bullet->y < 697 && T1_Enemy_bullet2->y < 697){
        T1_Enemy_bulletmove->start(20);
    }

    else{
        T1_Enemy_bulletmove->stop();
        delete_T1_E_bullet(bullet_1, bullet_2);
    }
}

void View:: T1_E_BulletMov(){

    if(T1_Enemy_bullet->y < 697 && T1_Enemy_bullet2->y < 697){

        T1_Enemy_bullet->y = T1_Enemy_bullet->y + 5;
        T1_Enemy_bullet2->y = T1_Enemy_bullet2->y + 5;
        T1_Enemy_bullet->setPos(T1_Enemy_bullet->x,T1_Enemy_bullet->y);
        T1_Enemy_bullet2->setPos(T1_Enemy_bullet2->x, T1_Enemy_bullet2->y);
        T1_E_bulletpodMoving(T1_Enemy_bullet, T1_Enemy_bullet2);
    }

}

void View::delete_T1_E_bullet(QGraphicsItem *bullet_1, QGraphicsItem *bullet_2){

    foreach(Type1_EnemyBullet *b, e1_Bullets){
        if(b == bullet_1){
            mainScene.removeItem(b);
            delete bullet_1;
            e1_Bullets.removeOne(b);
            T1_Enemy_bullet->y = 0;
        }
    }

    foreach(Type1_EnemyBullet *b, e1_Bullets){
        if(b == bullet_2){
            mainScene.removeItem(b);
            delete bullet_2;
            e1_Bullets.removeOne(b);
            T1_Enemy_bullet->y = 0;
        }
    }
}


View.h :

#pragma once

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QObject>

#include "player.h"
#include "type1_enemy.h"
#include "reload_virus.h"
#include "p_laserbullet.h"
#include "type1_enemybullet.h"

class View :public QGraphicsView
{
public:
    View();
    void view_elements();
    QList<reload_Virus*> Viruses;
    QList<QGraphicsItem*> p_Bullets;
    QList<Type1_EnemyBullet*> e1_Bullets;
    void viruspodMoving(QGraphicsItem *virus);
    void delete_reload_Virus(QGraphicsItem *virus);
    void delete_player_bullet(QGraphicsItem *bullet1,QGraphicsItem *bullet2);
    void p_bulletpodMoving(QGraphicsItem *bullet_1, QGraphicsItem *bullet_2);
    void delete_T1_E_bullet(QGraphicsItem *bullet_1, QGraphicsItem *bullet_2);
    void T1_E_bulletpodMoving(QGraphicsItem *bullet_1, QGraphicsItem *bullet_2);
    reload_Virus *r_vir;
    Player pl;
    Type1_Enemy *Type1_Enemy_res;

public slots:
    void addVirus();
    void virusMov();
    void p_bulletMov();
    void T1_E_BulletMov();
    void PlayerAttack();
    void Type1_EnemyAttack();
    void addType1Enemy();

private:
    QGraphicsScene mainScene;
    p_LaserBullet *player_bullet;
    p_LaserBullet *player_bullet2;
    Type1_EnemyBullet *T1_Enemy_bullet;
    Type1_EnemyBullet *T1_Enemy_bullet2;
    View *view;
    QTimer     *startGame; // Начало игры
    QTimer *create_reload_Virus;
    QTimer *reload_virusmove;
    QTimer *player_bulletmove;
    QTimer *T1_Enemy_bulletmove;
    QTimer *T1_Enemy_Attack;
    QTimer *create_type1_enemy;

};
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как исправить?

Прочитать сообщение об ошибке для начала. Понять, что оно говорит о том, что поломана куча. Силой мысли найти место в программе которое её ломает. Если силой мысли не получается, то скомпилировать программу с какими-нибудь полезными отладочными опциями, запустить и проанализировать вывод. Для gcc это была бы опция -fsanitize=address, что у M$ для этого есть я не знаю.
Ответ написан
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Судя по ошибке, вы что-то, выделенное через new, удаляете через delete и потом все-равно используете.

Вижу как минимум одно такое место. delete_reload_virus иногда удаляет virus, а потом что-то делает с r_vir. Но в качестве аргумента ей из viruspodMoving передается этот же самый r_vir.

Какая-то каша у вас там творится. Одни и те же переменные использются как члены класса и передаются как указатели по всей программе. Там черт ногу сломит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы