Удаление указателя в слоте при связи destroyed()

131
15 октября 2019, 06:20

У меня есть участок кода, который в определённых случаях генерирует ошибку, которую мне никак не удаётся понять. Связана она с освобождением памяти. В одном случае я спокойно могу удалить указатель, в другом же приложение падает.
Тот самый кусок кода

    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. При нажатии на кнопку "Закрыть" я его удаляю, получив указатель из сплиттера (он в нём размещается).

Ошибка появляется, если я закрываю программу без предварительного нажатия кнопки "Закрыть". Ни в одном из деструкторов нет удаления этого указателя, т.к. в качестве поля класса я его нигде не храню.
Извиняюсь, если плохо объяснил. При необходимости дополню вопрос.

Answer 1

Не очень понял для чего нужны такие сложности, но тем не менее предлагаю вам везде где можно заменить команду delete <widget*> на вызов sender()->deleteLater() и система сама все сделает как надо

READ ALSO
Ошибка при подключении DLL

Ошибка при подключении DLL

У меня есть DLL библиотекаВот ее код:

106
Что такое raw socket и в чем его преимущество?

Что такое raw socket и в чем его преимущество?

пытаюсь учить сетевое программирование, но пока слабо получаетсяЕсли с TCP или UDP вопрос не возникает, то с raw не могу разобраться

118
Проблемы с socket.async_accept() в boost::asio

Проблемы с socket.async_accept() в boost::asio

Пишу асинхронный TCP сервер

127