Удаление QDialog с помощью delete

287
12 ноября 2017, 17:12

Имеется следующий кусочек кода:

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?

Answer 1

... после delete ... qDebug() выведет "0"

Оператор delete делает указатель некорректным, но не зануляет его (так как сам указатель передаётся в функцию удаления по значению). Вы должны либо вручную присвоить ему NULL (или nullptr в C++11), либо просто не использовать.

... Второй qDebug() выдает ...

Добро пожаловать в мир неопределённого поведения.

То, что объект как бы остаётся доступным по старому адресу — всего лишь иллюзия. Вызвана она тем, что диспетчер памяти Windows (как, впрочем, и Linux) по умолчанию ничего не очищает при освобождении, а просто помечает соответствующую область как свободную; поэтому память, занимаемая объектом, продолжает хранить старые данные. Однако эта область может быть спокойно перекрыта данными другого объекта при очередном выделении памяти в куче.

Почему поведение неопределённое? Да потому что стандарт прямо это говорит относительно обращения к указателям, над которыми был выполнен delete или free().

READ ALSO
std::function для шаблонных функций

std::function для шаблонных функций

Есть такой класс

349
Возвращение массива функцией

Возвращение массива функцией

Есть кодВ функции double f(double x[], int n) делается вычисление нескольких функций с несколькими переменными

289
Как сделать шрифт в Qpainter больше

Как сделать шрифт в Qpainter больше

Делаю генератор мемов и хочу сделать нормальный текст а шрифт получается маленьким как его сделать большим?Я добавил spinBoX и собираюсь в нем...

332
События jQuery( анимация бургер меню)

События jQuery( анимация бургер меню)

Есть код, который плавно меняет значение свойства, нужно чтобы при втором нажатии на элемент значение менялось !!! вот моя попытка, но получеться...

288