Есть карта, она отображает int
на номер Test*
.Удалить указатели с карты
Все указатели Test*
выделены и назначены на карту позже. Тогда, я delete
ing значения карты и установите их в null
.
После этого оно проверяет действительность one
, и оно должно быть null
. Но, one
не null
.
#include <QString>
#include <QMap>
#include <QDebug>
class Test {
QString name;
public:
Test(const QString &name) : name(name) {}
QString getName() const { return name; }
};
int main() {
QMap<int, Test*> map;
Test *one = new Test("one");
Test *two = new Test("two");
Test *three = new Test("three");
map.insert(1, one);
map.insert(2, two);
map.insert(3, three);
for (auto itr = map.begin(); itr != map.end(); itr++) {
Test *x = *itr;
if (x) {
delete x;
x = 0; // ** Sets null to the pointer ** //
}
}
if (one) // ** Here one is not 0 ?! ** //
qDebug() << one->getName() << endl; // ** And then here crashes ** //
}
Я думаю, что я пропустил что-то, когда я delete
ING их в петле.
Как это можно исправить?
Второй вопрос: правильно ли это delete
s выделенные указатели?
Спасибо, я обновил вопрос, как насчет моего второго вопроса. – deepmax
Возможно, по второму вопросу вы спрашиваете, освобождена ли память, указанная этими указателями. Когда вы вызываете delete с помощью указателя, он освобождает выделенную память. Поэтому, когда вы пытаетесь получить к нему доступ, он вызывает «ошибку сегментации». Потому что переменная «одна» становится свисающим указателем. –
@Atique: Да, спасибо, подозревая Qt, я пропустил эти простые вопросы о указателях. – deepmax