无法在 C++ 中添加指向向量的指针

问题描述 投票:0回答:1

我正在尝试实现一个网格系统来检测游戏中坦克之间的碰撞。

我的目标是拥有大约 40 个单元格,这些单元格都有一个带有 tank 指针的向量。坦克应该在正确的网格单元格中保存并在移动到另一个时更新。

第一次向矢量添加坦克指针时,应用程序崩溃。这是我的代码的样子:

    vec2 position{ start_blue_x + ((i % max_rows) * spacing), start_blue_y + ((i / max_rows) * spacing) };
    Cell* tank_cell = Cell::find_cell_for_tank(position.x, position.y, cells);
    Tank tank = Tank(position.x, position.y, BLUE, tank_cell, &tank_blue, &smoke, 1100.f, position.y + 16, tank_radius, tank_max_health, tank_max_speed);
    tank_cell->tanks.push_back(&tank);

细胞.h

Cell(int column, int row, vector<Tank*> tanks);

这似乎发生在我将坦克推入牢房的最后一行。

Exception thrown: Access violation reading 

单元格::find_cell_for_tank()

    Cell* Cell::find_cell_for_tank(int pos_x, int pos_y, vector<Cell*>& cells)
{
    int tank_col = pos_x / CELL_WIDTH;
    int tank_row = pos_y / CELL_HEIGHT;
    
    for (int i = 0; i < cells.size(); i++) {
        if ((*cells.at(i)).column == tank_col && (*cells.at(i)).row == tank_row)
        {
            return cells.at(i);
        }
    }

    Cell* new_cell = &Cell(tank_col, tank_row, {});
    cells.push_back(new_cell);
    return new_cell;
}
c++ pointers vector reference
1个回答
2
投票

这是窃听

Cell* new_cell = &Cell(tank_col, tank_row, {});
cells.push_back(new_cell);
return new_cell;

您正在创建一个临时

Cell
对象,将指向该对象的指针推入向量 返回指向该临时对象的指针。

Cell
对象在第一行代码之后不存在(它是临时的),但是指向它的那些指针仍然存在。这称为 悬挂指针,使用这些指针中的任何一个都可能使您的代码崩溃。

尽量不要用那么多指针。他们没有理由,使用

std::vector<Cell>
而不是
std::vector<Cell*>
std::vector<Tank>
而不是
std::vector<Tank*>
.

如果你不使用指针,你就不会有悬挂指针。

© www.soinside.com 2019 - 2024. All rights reserved.