2013-03-31 2 views
0

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 deleteing 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 deleteing les dans la boucle.

Comment peut-il résoudre ce problème?

Deuxième question est, est-il correctement deletes les pointeurs alloués?

Répondre

4

Dans la boucle, la variable x est un pointeur local uniquement à l'intérieur de la boucle. Lorsque vous définissez cela sur NULL, vous ne définissez pas d'autres autres pointeurs sur NULL.

Ce que vous devez à est de définir la référence renvoyée par déréférencement l'itérateur NULL:

*itr = nullptr; 

Cela fera le pointeur sur la carte soit NULL, mais les autres pointeurs toujours pointer vers un maintenant zone de mémoire désallouée.


Lorsque vous avez deux pointeurs, il ressemble un peu à ceci:

 
+-----+ 
| one | ---\ 
+-----+  |  +---------------+ 
      >--> | Test instance | 
+-----+  |  +---------------+ 
| x | ---/ 
+-----+ 

Si vous définissez un des pointeurs, il ressemble à ceci:

 
+-----+ 
| one | ---\ 
+-----+  |  +---------------+ 
      >--> | Test instance | 
+-----+   +---------------+ 
| x | 
+-----+ 

La variable x est NULL mais la variable one pointe toujours vers l'objet. Et si l'objet a été supprimé, le déréférencement de ce pointeur provoque un comportement non défini.

+0

Merci, je mis à jour la question, Que diriez-vous de ma deuxième question. – deepmax

+1

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. –

+0

@Atique: Oui, merci, en me doutant de Qt, j'ai raté ces questions simples sur les pointeurs. – deepmax

1

moyen de supprimer Easiest tout serait:

qDeleteAll(map); 
Questions connexes