У вас есть свисающая ссылка в sprite
.
Эта свисающая ссылка появляется в следующей строке:
this->tiles[i][j] = Tile(x, y, this->tex[0]);
Что означает ссылка о Sprite::setTexture
?
Аргумент текстуры относится к текстуре, которая должна существовать до тех пор, пока ее использует спрайт. Действительно, спрайт не хранит свою собственную копию текстуры, а хранит указатель на тот, который вы передали этой функции. Если исходная текстура уничтожена и спрайт пытается ее использовать, поведение не определено.
Где именно проблема?
Tile(x, y, this->tex[0]);
Здесь новый экземпляр Tile
создано. tex
и sprite
являются переменными-членами Tile
. И sprite
по setTexture
относится к tex
.
tiles[i][j] = Tile(x,...);
В приведенной выше строке вызывается оператор копирования, который копирует sprite
/ tex
из временного объекта - созданного Tile(x,y,..)
). В результате в tiles[i][j]
у вас есть sprite
член, который ссылается на текстуру временного экземпляра - Tile(..)
(sprite
просто содержит указатель на текстуру). И, наконец, в конце полного выражения временный экземпляр уничтожается, tex
из Tile(..)
удаляется, а tiles[i][j].sprite
содержит недопустимый указатель на текстуру.
Решение?
Вы необходимо добавить конструктор копирования (оператор назначения копирования) Tile
, чтобы правильно инициализировать sprite
для хранения его собственного tex
(без ссылки на экземпляр, из которого сделана копия):
Например:
Tile& operator=(const Tile& theOther)
{
this->tex = theOther.tex;
this->sprite.setTexture(this->tex);
return *this;
}
в сгенерированном по умолчанию операторе назначения сгенерированной копии this->sprite
указывает на theOther.tex
текстуру, что неверно.