crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
йцукен
  опции профиля:
сообщение 28.12.2007, 15:51
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 28.12.2007
Пользователь №: 57

Спасибо сказали: 0 раз(а)




Репутация:   0  


Понял, спасибо. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bobdva
  опции профиля:
сообщение 2.1.2009, 19:57
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 2.10.2008
Из: Москва
Пользователь №: 377

Спасибо сказали: 0 раз(а)




Репутация:   0  


что сие значит
Цитата(ViGOur @ 28.12.2007, 16:45) *
для того чтобы объект был удален, управление должно вернуться в тот цикл обработки событий, в котором была вызвана deleteLater().


т.е что как на деле это происходит ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 3.1.2009, 21:12
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(bobdva @ 2.1.2009, 19:57) *
что сие значит
Цитата(ViGOur @ 28.12.2007, 16:45) *
для того чтобы объект был удален, управление должно вернуться в тот цикл обработки событий, в котором была вызвана deleteLater().


т.е что как на деле это происходит ?


Для многопоточных приложений. Есть гуишный QEventLoop, у каждого нового потока свой QEventLoop. Если где-то в потоке зациклить через while(1) код, то возвращение в eventloop никогда не вернется и объект через deleteLater удален не будет.

Т.ч. на деле это обычно выглядит так:
- жмешь кнопку
- приходит сигнал clicked()
- вызывается слот on_button_clicked()
- в слоте вызывается deleteLater()
- происходит выход из слота
- возвращение в код, где был emit сигнала clicked()
- возвращение в главный eventloop
- удаление объекта
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 19:49