У меня есть участок кода, который в определённых случаях генерирует ошибку, которую мне никак не удаётся понять. Связана она с освобождением памяти. В одном случае я спокойно могу удалить указатель, в другом же приложение падает.
Тот самый кусок кода
EditPortsWidget *editPortsTable = new EditPortsWidget;
editPortsTable->show();
// Чистим память
connect(editPortsTable, &EditPortsWidget::destroyed,
[=]
{
delete static_cast<EditPortsWidget*>(sender() );
});
Ошибка не появляется, если этот код вызывается при нажатии кнопки "Закрыть". Во время обработки кода, что приведён ниже, вызывается код, что располагается выше (т.к. EditPortsWidget посылает сигнал distroyed()). Вот что происходит при нажатии этой кнопки:
delete static_cast<EditPortsWidget*>(guiVariables.splEditPorts->widget(0) );
Думаю, здесь нужно объяснить. EditPortsWidget является наследником QWidget. При нажатии на кнопку "Закрыть" я его удаляю, получив указатель из сплиттера (он в нём размещается).
Ошибка появляется, если я закрываю программу без предварительного нажатия кнопки "Закрыть". Ни в одном из деструкторов нет удаления этого указателя, т.к. в качестве поля класса я его нигде не храню.
Извиняюсь, если плохо объяснил. При необходимости дополню вопрос.
Не очень понял для чего нужны такие сложности, но тем не менее предлагаю вам везде где можно заменить команду delete <widget*>
на вызов sender()->deleteLater()
и система сама все сделает как надо
Виртуальный выделенный сервер (VDS) становится отличным выбором
пытаюсь учить сетевое программирование, но пока слабо получаетсяЕсли с TCP или UDP вопрос не возникает, то с raw не могу разобраться