我正在尝试实现一个网格系统来检测游戏中坦克之间的碰撞。
我的目标是拥有大约 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;
}
这是窃听
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*>
.
如果你不使用指针,你就不会有悬挂指针。