Имеется следующий кусочек кода:
void AddOrderWindow::on_pushButton_clicked(){
// Вызываем окно
ModuleDeteils *window = new ModuleDeteils(socket, account, this);
qDebug() << window;
...
...
window->exec();
...
...
delete window;
qDebug() << window;
}
Если я правильно понимаю, то после delete объект по указателю window должен быть удален, а в qDebug() выведет "0". Но происходит следующие:
Первый qDebug() выдает
ModuleDeteils(0x190fd540, name="ModuleDeteils");
ВторойqDebug() выдает
QObject(0x190fd540, name="ModuleDeteils");
Если на кнопку нажать повторно, то получим другой адрес:
ModuleDeteils(0x190fd800, name="ModuleDeteils"); QObject(0x190fd800, name="ModuleDeteils");
При всем этом я точно знаю, что вызывается одно и тоже окно, т.к. специально перед закрытием окна отключаю один из виджетов с помощью метода setDisabled(true).
Почему окно не удаляется при вызове delete?
... после delete ... qDebug() выведет "0"
Оператор delete делает указатель некорректным, но не зануляет его (так как сам указатель передаётся в функцию удаления по значению). Вы должны либо вручную присвоить ему NULL (или nullptr в C++11), либо просто не использовать.
... Второй qDebug() выдает ...
Добро пожаловать в мир неопределённого поведения.
То, что объект как бы остаётся доступным по старому адресу — всего лишь иллюзия. Вызвана она тем, что диспетчер памяти Windows (как, впрочем, и Linux) по умолчанию ничего не очищает при освобождении, а просто помечает соответствующую область как свободную; поэтому память, занимаемая объектом, продолжает хранить старые данные. Однако эта область может быть спокойно перекрыта данными другого объекта при очередном выделении памяти в куче.
Почему поведение неопределённое? Да потому что стандарт прямо это говорит относительно обращения к указателям, над которыми был выполнен delete или free().
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости