QGraphicsScene::addItem
принимает право собственности на добавленный элемент, отметьте doc . Это означает, что теперь он отвечает за уничтожение элемента, что происходит, когда вы очищаете сцену с помощью QGraphicsScene::clear
. С этого момента ваш вектор полон висячих указателей.
Одним из быстрых решений является замена вызова на QGraphicsScene::clear
удалением элементов вручную через QGraphicsScene::removeItem
, который не уничтожает элемент (он возвращает право собственности вызывающей стороне). Затем уничтожьте только те элементы, которые действительно находятся вне сцены, и добавьте остальные. Другой вариант, более эффективный, состоит в том, чтобы удалить только те элементы, которые вам нужны, оставив оставшиеся, чтобы вы также увеличили производительность, избегая добавления большого количества элементов из истории.
Без полного знания вашего кода вторыми параметрами могут быть что-то вроде:
if(_indexHistoryRoam < _indexHistory.size()){
// Remove only items beyond history
const int range = _sceneHistory.size() - _indexHistory[_indexHistoryRoam];
for (int i = range; i < _sceneHistory.size(); i++){
scene->removeItem((QGraphicsItem*)_sceneHistory[i]);
delete _sceneHistory[i]; // item must be destroyed to avoid a leak
}
_indexHistoryRoam++;
} else { // force removal of all elements
scene->clear();
}
scene->update();