QObject::deleteLater, когда проиходит освобождение памяти? |
Здравствуйте, гость ( Вход | Регистрация )
QObject::deleteLater, когда проиходит освобождение памяти? |
йцукен |
28.12.2007, 15:38
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 5 Регистрация: 28.12.2007 Пользователь №: 57 Спасибо сказали: 0 раз(а) Репутация: 0 |
Я так и не понял, когда происходит освобождегние памяти в вызове QObject::deleteLater?
Это эдентично такому коду или нет? QObject *pObj; // ... delete pObj; pObj = 0; |
|
|
ViGOur |
28.12.2007, 15:45
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Как я понял память освобождается после того, как были обработаны все события.
И если выполнить тот код, который вы привели ниже, может произойти ошибка, из-за того, что некоторые слоты не успели отработать, а обьект уже удален. Если перевести описание данной функции, то вот, что получиться: Цитата void QObject::deleteLater () [slot]
Отмечает объект для удаления. Объект будет удален когда контроль вернется к циклу обработки сообщений. Обратите внимание, что вход и выход из нового цикла обработки событий (например при открытии модального диалога) не выполнят отсроченное удаление; для того чтобы объект был удален, управление должно вернуться в тот цикл обработки событий, в котором была вызвана deleteLater(). См. также destroyed() и QPointer. Сообщение отредактировал ViGOur - 28.12.2007, 15:48 |
|
|
bobdva |
2.1.2009, 19:57
Сообщение
#3
|
Студент Группа: Участник Сообщений: 29 Регистрация: 2.10.2008 Из: Москва Пользователь №: 377 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
SABROG |
3.1.2009, 21:12
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
что сие значит для того чтобы объект был удален, управление должно вернуться в тот цикл обработки событий, в котором была вызвана deleteLater(). т.е что как на деле это происходит ? Для многопоточных приложений. Есть гуишный QEventLoop, у каждого нового потока свой QEventLoop. Если где-то в потоке зациклить через while(1) код, то возвращение в eventloop никогда не вернется и объект через deleteLater удален не будет. Т.ч. на деле это обычно выглядит так: - жмешь кнопку - приходит сигнал clicked() - вызывается слот on_button_clicked() - в слоте вызывается deleteLater() - происходит выход из слота - возвращение в код, где был emit сигнала clicked() - возвращение в главный eventloop - удаление объекта |
|
|
Текстовая версия | Сейчас: 26.11.2024, 0:30 |