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 будет удален/поврежден.
Я проверил RAII на wikibooks ... Но я до сих пор не понимаю, почему wp2 никогда не получит тот же адрес, что и wp (адрес wp до его удаления) – Nyaruko
wp2 получает новый адрес, потому что вы его назначаете * new * 'Waypoint()'. –
Если я понимаю проблемы @Nyaruko, поскольку мы удалили экземпляр wp, который теперь свободен, что, если память-распределитель так может быть задан для нового экземпляра wp2. После этого цикл события забирает событие удаления wp_widget и вызывает его деструктор. Вы удаляете _wp в деструкторе виджета? Можете ли вы показать код для деструктора WaypointWidget и объявления участника _wp? – Pratham