Russian Qt Forum
Ноябрь 06, 2024, 04:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: ->deleteLater()  (Прочитано 27920 раз)
Orfus
Гость
« : Сентябрь 30, 2011, 14:33 »

Доброго времени суток. Объясните пожалуйста, что происходит при таком раскладе.
Код
C++ (Qt)
QObject *obj = new QObject(this);
obj->deleteLater();
obj=new QObject(this);

Какой объект будет удалён? Тот, что был создан в первой строке или третей? И будет ли вообще удалён?  Непонимающий
Этот вопрос терзает меня уже не первый день.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Сентябрь 30, 2011, 14:36 »

Первый, конечно. Не путай объект и указатель на объект.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Сентябрь 30, 2011, 14:37 »

obj - это не объект, а всего лишь указатель на него. Поэтому указанный код будет работать нормально, удалится первый объект.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 30, 2011, 14:47 »

Первый, но конструкция потенциально опасна - неизвестно когда дело дойдет до удаления и будет ли этот момент подходящим
Записан
Orfus
Гость
« Ответ #4 : Сентябрь 30, 2011, 14:57 »

Премного благодарен за ответы.

Первый, но конструкция потенциально опасна - неизвестно когда дело дойдет до удаления и будет ли этот момент подходящим
Насчёт этого волнений нет Подмигивающий
Записан
ieroglif
Гость
« Ответ #5 : Сентябрь 30, 2011, 16:07 »

Первый, но конструкция потенциально опасна - неизвестно когда дело дойдет до удаления и будет ли этот момент подходящим

Код
C++ (Qt)
QObject *obj = new QObject(this);
Объявили переменную под названием obj, размером с "указатель", типа "указатель на QObject". в памяти выделилось место.
В эту память (переменную) положили адрес нового созданного объекта типа QObject.
Код
C++ (Qt)
obj->deleteLater();
объекту, который располагается по адресу, записанному в переменной obj, дали команду "самоудались при первом возможно случае"
Код
C++ (Qt)
obj=new QObject(this);
в переменную obj записали новый адрес - это новый объект типа QObject

итого: в чём эта конструкци потенциально опасна?
Записан
asvil
Гость
« Ответ #6 : Сентябрь 30, 2011, 16:44 »

Код:
неизвестно когда дело дойдет до удаления и будет ли этот момент подходящим
Хотя жаба и прочие обладатели gc не беспокоятся по этому поводу.

P.S. ах да это же сиплюплюс
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Сентябрь 30, 2011, 19:00 »

Насчёт этого волнений нет Подмигивающий
Лучше чтобы они были Улыбающийся  Добавим всего одну строчку

Код
C++ (Qt)
QObject *obj = new QObject(this);
obj->deleteLater();
delete obj;        // новая строка
obj=new QObject(this);
И становится совсем непросто ответить "а как же это будет(?) работать"  Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Сентябрь 30, 2011, 19:04 »

будет
Записан
Orfus
Гость
« Ответ #9 : Сентябрь 30, 2011, 19:14 »

Лучше чтобы они были Улыбающийся  Добавим всего одну строчку

Код
C++ (Qt)
QObject *obj = new QObject(this);
obj->deleteLater();
delete obj;        // новая строка
obj=new QObject(this);
И становится совсем непросто ответить "а как же это будет(?) работать"  Улыбающийся

При таком раскладе сдаётся мне произойдёт чего нибудь не то при попытке обратится к объекту который насильно удалён был.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 30, 2011, 21:02 »

При таком раскладе сдаётся мне произойдёт чего нибудь не то при попытке обратится к объекту который насильно удалён был.
Так что, написал delete - уже насильник? Улыбающийся Работать будет т.к. деструктор вычистит из EventLoop все  события посланные удаляемому. Все implicit действия чем-то похожи и первое впечатление почти всегда "ой как здорово! (элегантно, изящно и.т.п.)". Потом правда выясняется что это не совсем так.
Записан
Yuriy
Гость
« Ответ #11 : Сентябрь 30, 2011, 23:57 »

Предлагаю использовать valgrind.

Я даже и не подозревал, какие утечки памяти вытворял такими deleteLater или WA::DeleteOnClose и т.д., в общем на мой взгляд верном коде. В своих двух проектах сотворил 1000 исправлений за два дня.

Утечки могут быть не только при использовании оператора типа Delete. Утечек хватает при некорректном использовании Qt-шных виджетов.

Я и представить не  мог, что к примеру злосчастный QRubberBand может наковырять 10Мб утечек памяти, при этом с виду код абсолютно стандартный. Про QSQlite вообще отдельная тема, до поиска утечек даже не подозревал, что у меня такие руки кривые, хотя многие классы использую в стандартном порядке, как Assistent порекомендовал
Записан
asvil
Гость
« Ответ #12 : Сентябрь 30, 2011, 23:59 »

звучит несколько маркетологовски, если несложно, покажите diff
Записан
Yuriy
Гость
« Ответ #13 : Октябрь 01, 2011, 00:26 »

Да нет никакого маркетинга, слава богу.
Есть такая фича, когда запускаешь проект из под valgrind, то он начинает валить memory leak'и и прочие вещи в окно Результат выполнения в QtCreator.
И когда он насчитывает их более 1000, то просто перестает об этом писать, мол иди правь свой проект !
Я думаю что такая участь может постигнуть любого, не я один такой  Смеющийся
Записан
andrew.k
Гость
« Ответ #14 : Октябрь 01, 2011, 01:32 »

При таком раскладе сдаётся мне произойдёт чего нибудь не то при попытке обратится к объекту который насильно удалён был.
Так что, написал delete - уже насильник? Улыбающийся Работать будет т.к. деструктор вычистит из EventLoop все  события посланные удаляемому. Все implicit действия чем-то похожи и первое впечатление почти всегда "ой как здорово! (элегантно, изящно и.т.п.)". Потом правда выясняется что это не совсем так.
Что-то я сильно сомневаюсь, что это будет работать.

"Deleting a QObject while pending events are waiting to be delivered can cause a crash."
deleteLater посылает объекту событие:
QEvent::DeferredDelete   52   The object will be deleted after it has cleaned up.
Я уверен что будет коре.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.15 секунд. Запросов: 22.