Il existe une carte, elle correspond à int
à Test*
.Supprimer les pointeurs d'une carte
Tous les pointeurs Test*
sont attribués avant et affectés à la carte ultérieurement. Ensuite, je suis delete
ing valeurs de la carte et les définir à null
. Ensuite, il vérifie la validité de one
, et il est censé être null
. Mais, one
n'est pas 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 ** //
}
Je pense, je raté quelque chose quand je suis delete
ing les dans la boucle.
Comment peut-il résoudre ce problème?
Deuxième question est, est-il correctement delete
s les pointeurs alloués?
Merci, je mis à jour la question, Que diriez-vous de ma deuxième question. – deepmax
Probablement par la deuxième question, vous demandez si la mémoire pointée par ces pointeurs ont été désallouées. Lorsque vous appelez delete avec un pointeur, il libère la mémoire pointée. Donc, lorsque vous essayez d'y accéder plus loin, cela provoque un "défaut de segmentation". Parce que la variable "un" devient un pointeur qui pend. –
@Atique: Oui, merci, en me doutant de Qt, j'ai raté ces questions simples sur les pointeurs. – deepmax