Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ';std::bad#u alloc';尝试删除优先级队列元素C++;_C++_Qt_Bad Alloc - Fatal编程技术网

C++ ';std::bad#u alloc';尝试删除优先级队列元素C++;

C++ ';std::bad#u alloc';尝试删除优先级队列元素C++;,c++,qt,bad-alloc,C++,Qt,Bad Alloc,当船舶返回港口时,速度变为0.0,用户输入护罩和燃油 –如果燃油为0.0,船舶将被摧毁 -仍在优先队列中的船只受到10点护盾伤害,损失15点燃料 –如果防护罩或燃料低于0.0,则船舶将被摧毁 尝试为我的最终项目实施这些说明。这些战舰是指针型的,它们在一个名为“战场”的优先级队列中。船舶也存在于一个名为“端口”的指针列表中。我正试图摧毁那些受到致命伤害的船只,但当我试图展示它们时,Qt程序崩溃了,我得到了错误。这是我在项目中必须做的最后一件事:( 来自各种文件的重要代码块: 我已经尝试从港口删除船

当船舶返回港口时,速度变为0.0,用户输入护罩和燃油

–如果燃油为0.0,船舶将被摧毁

-仍在优先队列中的船只受到10点护盾伤害,损失15点燃料

–如果防护罩或燃料低于0.0,则船舶将被摧毁

尝试为我的最终项目实施这些说明。这些战舰是指针型的,它们在一个名为“战场”的优先级队列中。船舶也存在于一个名为“端口”的指针列表中。我正试图摧毁那些受到致命伤害的船只,但当我试图展示它们时,Qt程序崩溃了,我得到了错误。这是我在项目中必须做的最后一件事:(

来自各种文件的重要代码块:

我已经尝试从港口删除船舶,也尝试直接从港口删除船舶,但优先级队列混乱

class Civilization {
string name;
int x;
int y;
list<Villager> villagers;
list<Ship*> port;
priority_queue<Ship*, vector<Ship*>, Ship::comp> battle;
}


void Civilization::damageShips()
{
priority_queue<Ship*, vector<Ship*>, Ship::comp> copy = battle;
Ship *s = battle.top();
s->setSpeed(0.0);

while(!copy.empty()) {
    Ship *s = copy.top();
    s->setShield(s->getShield() - 10);
    s->setFuel(s->getFuel() - 15);
    copy.pop();
}


priority_queue<Ship*, vector<Ship*>, Ship::comp> temp;

while(!copy.empty()) {
    Ship *s = copy.top();
    string id = s->getId();

    if (s->getShield() > 0 && s->getFuel() > 0) {
        temp.push(s);
    } else
        deleteShip(id);
    copy.pop();
}


battle = temp;
battle.pop();
}

void battlefielddisplay::setCivilization(Civilization *civilizaition)
{
size_t size = civilizaition->battlefieldSize();
ui->battlefield_table->setRowCount(int(size));

Civilization &c = *civilizaition;

priority_queue<Ship*, vector<Ship*>, Ship::comp> copy = c.getBattlefield();

int cnt = 0;
while(!copy.empty()) {
    Ship *s = copy.top();

    QString id = QString::fromStdString(s->getId());
    QString fuel = QString::number(s->getFuel());
    QString speed = QString::number(s->getSpeed());
    QString shield = QString::number(s->getShield());
    QString warriors = QString::number(s->size());

    QTableWidgetItem *idItem = new QTableWidgetItem(id);
    QTableWidgetItem *fuelItem = new QTableWidgetItem(fuel);
    QTableWidgetItem *speedItem = new QTableWidgetItem(speed);
    QTableWidgetItem *shieldItem = new QTableWidgetItem(shield);
    QTableWidgetItem *warriorsItem = new QTableWidgetItem(warriors);

    ui->battlefield_table->setItem(cnt, 0, idItem);
    ui->battlefield_table->setItem(cnt, 1, fuelItem);
    ui->battlefield_table->setItem(cnt, 2, speedItem);
    ui->battlefield_table->setItem(cnt, 3, shieldItem);
    ui->battlefield_table->setItem(cnt, 4, warriorsItem);

    cnt++;

    copy.pop();
}

}

void MainWindow::on_battle_remove_ship_clicked()
{
if (flag) {
    Civilization* c = videogame.searchCivilization(ui->civilization_search_input->text().toStdString());

    double shield = ui->shield_battle_remove->value();
    double fuel = ui->fuel_battle_remove->value();

    Ship *s = c->getBattleShip();
    s->setSpeed(0.0);
    s->setShield(shield);
    s->setFuel(fuel);

    c->damageShips();

    qDebug() << "[✔]" << "Removed ship from battlefield";

} else
    QMessageBox::information(this, "Error", "Civilization not found");
}

bool Civilization::deleteShip(string &id)
{
bool found = false;
for(size_t i(0); i < shipSize(); ++i) {
    auto it = port.begin();
    advance(it, i);
    auto x = *it;
    if (x->getId() == id) {
        port.erase(it);
        delete x;
        --i;
        found = true;
    }
}
return found;
}
阶级文明{
字符串名;
int x;
int-y;
列出村民名单;
列表端口;
优先级队列战;
}
空虚文明::破坏船只()
{
优先级\队列副本=战斗;
船*s=战斗。顶部();
s->设定速度(0.0);
而(!copy.empty()){
Ship*s=copy.top();
s->setShield(s->getShield()-10);
s->setFuel(s->getFuel()-15);
copy.pop();
}
优先级队列温度;
而(!copy.empty()){
Ship*s=copy.top();
字符串id=s->getId();
如果(s->getShield()>0&&s->getFuel()>0){
温度推力;
}否则
船舶(id);
copy.pop();
}
战斗=临时;
battle.pop();
}
无效战场显示::设置文明(文明*文明)
{
大小=文明->战场大小();
ui->battlement_table->setRowCount(int(size));
文明&c=*文明;
优先级_队列副本=c.getbattle();
int-cnt=0;
而(!copy.empty()){
Ship*s=copy.top();
QString id=QString::fromStdString(s->getId());
QString fuel=QString::number(s->getFuel());
QString speed=QString::number(s->getSpeed());
qstringshield=QString::number(s->getShield());
QString-warriors=QString::number(s->size());
QTableWidgetItem*idItem=新的QTableWidgetItem(id);
QTableWidgetItem*fuelItem=新的QTableWidgetItem(燃料);
QTableWidgetItem*speedItem=新的QTableWidgetItem(速度);
QTableWidgetItem*shieldItem=新的QTableWidgetItem(屏蔽);
QTableWidgetItem*WarriorItem=新的QTableWidgetItem(战士);
用户界面->战场_表->设置项(cnt,0,idItem);
ui->战场_表->设置项(cnt,1,fuelItem);
ui->战场_表->设置项(cnt,2,速度项);
ui->战场_表->设置项(cnt,3,防护项);
ui->战场_表->设置项(cnt,4,作战项目);
cnt++;
copy.pop();
}
}
void主窗口::在_battle _remove _ship _clicked()上
{
国际单项体育联合会(旗){
文明*c=videogame.searchcivility(用户界面->文明搜索\输入->文本().toStdString());
双盾=ui->shield\u battle\u remove->value();
双燃料=ui->fuel\u battle\u remove->value();
舰船*s=c->getBattleShip();
s->设定速度(0.0);
s->setShield(防护罩);
s->设置燃料(燃料);
c->损坏船舶();

qDebug()我看到的主要问题是删除对象时没有从容器中删除指针。您多次迭代同一容器并试图访问删除的对象

另一个问题是,同一队列有多个副本,因此即使从主容器中删除指针也可能导致问题


尝试重新考虑算法,特别注意对象的生命周期。例如,您可能会进行延迟删除:不删除,只需将对象标记为以后将删除的对象。您可能会在函数结束时进行清理。

deleteShip
中删除对象,但不删除poin来自
端口的指针。下次尝试访问时会发生什么?多次复制优先级队列-原因是什么?如何删除指针?我仍在了解它们。我正在制作副本,因为当我要显示PQ中的内容时,我需要逐个删除它们,而我不希望原始PQ被删除被清除。对已删除元素的引用和迭代器无效。