2014-12-01 2 views
0

Qt сказал, что deleteLater вызывается после возврата цикла события. Так что, если у меня есть следующий код:qt, это безопасный способ использования deleteLater?

Waypoint* wp = new Waypoint(); 
WaypointWidget* wp_widget = new WaypointWidget(wp); 
... 
delete wp; 
wp_widget->deleteLater(); 
... 
Waypoint* wp2 = new Waypoint(); 
WaypointWidget* wp_widget2 = new WaypointWidget(wp2); 

конструктор WaypointWidget является:

WaypointWidget(Waypoint* wp){ 
    _wp = wp;//_wp is declared as private variable inside WaypointWidget.h 
} 

Меня беспокоит то, что, по какой-то ситуации, wp2 будет принимать один и тот же адрес, что wp, и когда объект deleteLater() вызывает , wp_widget, наконец, удаляется. Соответствующие _wp будут удалены. И поскольку он имеет тот же адрес, что и wp2. wp2 будет удален/поврежден.

ответ

2

Вы звоните deleteLater для wp_widget, а не для wp, поэтому тот же адрес не будет установлен. Возможная ошибка будет, если вы попытаетесь получить доступ к _wp в WaypointWidget деструкторе.

Я рекомендую вам ознакомиться с RAII.

+0

Я проверил RAII на wikibooks ... Но я до сих пор не понимаю, почему wp2 никогда не получит тот же адрес, что и wp (адрес wp до его удаления) – Nyaruko

+1

wp2 получает новый адрес, потому что вы его назначаете * new * 'Waypoint()'. –

+2

Если я понимаю проблемы @Nyaruko, поскольку мы удалили экземпляр wp, который теперь свободен, что, если память-распределитель так может быть задан для нового экземпляра wp2. После этого цикл события забирает событие удаления wp_widget и вызывает его деструктор. Вы удаляете _wp в деструкторе виджета? Можете ли вы показать код для деструктора WaypointWidget и объявления участника _wp? – Pratham

Смежные вопросы