[Qt Undo Framework] Борьба с утечками памяти в QUndoCommand'ах |
Здравствуйте, гость ( Вход | Регистрация )
[Qt Undo Framework] Борьба с утечками памяти в QUndoCommand'ах |
Obey-Kun |
1.12.2010, 4:47
Сообщение
#1
|
Студент Группа: Участник Сообщений: 96 Регистрация: 24.3.2010 Пользователь №: 1556 Спасибо сказали: 3 раз(а) Репутация: 0 |
Итак. У меня есть команды для создания и для удаления некоторого объекта из модели.
Всё бы хорошо, но такой простой подход чреват утечками памяти. Если так получилось, что на итем не ссылаются больше никакие команды (то есть они уничтожены тем или иным способом) и он не находится в ItemModel, то он занимает лишнюю память. Qt Undo Framework устроен так, что команды в могут удаляться в одном из следующих случаев:
Таким образом, команды могут удаляться находясь как в отменённом, так и в применённом состоянии. И контролировать память при этом несколько затруднительно. В случае собственной модели решение проблемы простое: нигде не храним указатели на Item напрямую. Везде используем QSharedPointer<Item> (в CreateItemCommand, в RemoveItemCommand и в ItemModel). Не надо заботиться об удалении — этот итем самоудалится, если на него больше ничего не ссылается. Тут даже деструкторы писать не надо. Всё усложняется, если мы не контролируем то, как хранятся указатели на итемы в ItemModel. Например, если ItemModel унаследован от QGraphicsScene (а там, как известно, итемы хранятся в виде обычных указателей). Как тут быть? P.S.: по ходу, в примере из документации Qt как раз-таки допущен косяк, из-за которого будет происходить такая утечка памяти — единожды созданные итемы ни при каких условиях не удаляются. Запощу завтра в их багзиллу. upd: http://bugreports.qt.nokia.com/browse/QTBUG-15756 Сообщение отредактировал Obey-Kun - 1.12.2010, 5:55 |
|
|
Текстовая версия | Сейчас: 26.12.2024, 5:05 |