Я пытаюсь создать класс лабиринта, который может читать входной поток с описанием лабиринта и возвращать лабиринт. Однако, когда я запускаю тест с этим заданным входным потоком:
20 10
####################
#................<.#
#..................#
#...###............#
#.....#............#
#.....#............#
#...###............#
#..................#
#..................#
####################
Это дает ошибку сегментации, и я запускаю объектный файл на valgrind, чтобы проверить, что происходит:
Invalid write of size 8
==2482545== at 0x4032CD: Maze::setTile(Position const&, Tile*) (maze.cpp:47)
==2482545== by 0x40347B: Maze::read(std::istream&) (maze.cpp:67)
.....
==2482545== Address 0x0 is not stack'd, malloc'd or (recently) free'd
Я не очень понимаю, почему в моем коде произошла ошибка сегментации или неправильная запись, я должен был выделить место для каждой плитки внутри моей функции setTile, поэтому для меня должно быть место для записи. Я также сложил tile_collection с моим конструктором, поэтому tile_collection должен быть инициализирован, когда я вызвал Maze (20,10), и изменение размера внутри setTile должно работать. Можете ли вы указать, что мне не хватает? Заранее спасибо.
Maze::Maze(int width,int height):
Width(width),Height(height){
vector<Tile*>* tile_collection=new vector<Tile*>;
}
void Maze::setTile(const Position &pos,Tile *tile){
tile_collection.resize(pos.getX()+pos.getY()*Width);
tile_collection[pos.getX()+pos.getY()*(Width)]=tile;
}
Maze *Maze::read(std::istream &in){
int x;int y;char c;
if ((in>>x)&&(in>>y)){
Maze *new_maze=new Maze(x,y);
//loop over the specified maze dimension
for (int i=0;i<y;i++){
for (int j=0;j<x;j++){
if (in>>c){
//using tilefactory to change character into a tile
TileFactory *fac=fac->getInstance();
Tile* temp=fac->createFromChar(c);
//if createFromChar fails, return nullptr, otherwise set tile at position j,i
if (temp==nullptr){
return nullptr;
}
else{
new_maze->setTile(Position(j,i),temp);
}
}
}
}
return new_maze;
}
else{
return nullptr;
}
}