Не удаляется объект из памяти

201
15 декабря 2016, 16:05

Вспоминаю C++, используя Qt.

    Model::Item* item;
    item = new Model::Item();
    item->Title = "XXX";
    item->Price = 20.00;
    item->Id = 0;
    //смотрю через дебаггер, вижу объект с полями имеющими значения
    delete item;
    item;
    //объект продолжает существовать, все поля имеют те же значения
    if(item)
        qDebug() << "item exists"; //попадаю в этот блок

Ожидал увидеть отсутствие объекта item и значение указателя что-то типа 0x0. Что делаю не так?

Answer 1

Вы путаетесь в терминах - где-то в памяти есть объект класса Model::Item и есть указатель на него item. В строке item = new Model::Item(); вы создаете объект в памяти и присваиваете его адрес указателю item, указатель по сути это просто переменная типа unsigned long (? точно не помню, да и от конкретной платформы зависит вроде) т.е. не более чем число, но с возможностью дергать поля и методы того типа, на который указывает, при этом эти поля и методы никак не влияют на сам указатель, только на объект. В строке delete item; вы удаляете объект класса Model::Item, теперь память где он раньше был свободна, но указатель по прежнему указывает на нее, вот if(item) и срабатывает, но по факту по этому адресу уже мусор и что произойдет если вы попытаетесь к нему обратиться неизвестно (может падение, может мусор какой в ответ получите). Скажу вам по секрету, если вы этот иф поставите второй строкой он тоже скорее всего сработает - он ведь срабатывает всегда когда item не равен nil, а изначально вы его не занилялли

По поводу объект продолжает существовать - я не уверен что удаление объекта через деструктор это автоматом и затирание его в памяти, для ускорения при некритичных по секретности операциях память вполне может просто помечаться как свободная, как это происходит в файловой системе при удалении файла, но реально нулями она не затирается и формально пока вы не записали что-то новое из той области памяти можно прочитать уже удаленный объект.

READ ALSO
Односвязный список

Односвязный список

Всем добра

227
Приведение map к map

Приведение map к map

Как привести bs к unordered_map<int, shared_ptr<A> >?

178
Как отобразить воксели?

Как отобразить воксели?

Хочу понять, как пользоваться вокселямиКак всё это работает, представляю, а вот как это выразить в кусочке кода на c++ - не знаю

186