Есть объект на сцене, который сам себя добавляет на нее и сам себя удаляет:
Monster::Monster(CentralDataStruct& data) : QObject(nullptr), QGraphicsRectItem(nullptr), centralData(data)
{
setRect(0, 0, TileSize, TileSize);
centralData.scene->addItem(this);
destroyTimer = new QTimer(this);
connect(destroyTimer, SIGNAL(timeout()), this, SLOT(destroySlot()));
}
Monster::~Monster()
{
scene()->removeItem(this);
}
void Monster::advance(int phase)
{
if (!phase)
{
emit destroySignal();
//destroyTimer->start(1);
}
}
void Monster::destroySlot()
{
emit destroySignal();
}
Хранится в std::list, но это не принципиально.
Странность заключается в том, что если он из метода advance посылает сигнал вовне (там очищаем список, скажем), то приключается крэш — сцена обращается по невалидному указателю. Если же посылать сигнал через таймер, даже с минимальной задержкой (закомменченная строка), все обрабатывается нормально, крэша нет. В обоих случаях снаружи видно, что объект удаляется со сцены.
Извне, опять же, объект удаляется корректно.
Как так получается? В чем засада?
https://www.youtube.com/watch?v=-Ui4prpCZ0w