2010-11-22 12 views
2
&(*_shmItr) == NULL 

Ceci est une question tout à fait noob, mais je suis un novice à C++.Est-ce invalide & (* _ shmItr) == NULL où _shmItr est un itérateur List

dans GCC 3.1.2 lorsque vous vérifiez _shmItr == NULL est parfaitement bien, mais comme GCC 4.2.2 c'est une erreur. J'ai fait google à propos de l'erreur. ils disent que le déréférencement et le référencement permettront de résoudre le problème. et ça l'a fait. J'étais heureux. Mais comme j'en apprends plus sur l'itérateur. Je pense peut-être que cela passe l'erreur, mais pas valide et peut donner un problème d'exécution. Quelle est votre suggestion me ...

Je l'ai fait peu de recherche et a constaté que

_shmItr == _shmItr.end() 

sert également dans le même but et plus correct. Corrigez-moi si j'ai tort, s'il-vous plait.

Essentiellement, nous essayons de vérifier si _shmItr contient quelque chose de non valide ou non. avant de faire une opération.

Merci d'avance.

Voici le morceau de code

_shpmtItr = _shpmtList.begin(); 

if(_shpmtItr == NULL) 
{ 
    eaLogMsg << setid("APP_FAILED") 
      << "_shpmtItr is NULL in some::few()" 
      << endl; 

    return APP_FAILURE; 
} 

Cela peut vous dire le scénario. static

+0

Les itérateurs sont un concept différent, plus général que les pointeurs. Un itérateur peut être implémenté comme un pointeur, mais vous ne devriez jamais vous en fier. –

Répondre

2

Si vous vérifiez que vous êtes passé à la fin de la liste, utilisez list::end. Il n'y a aucune garantie que l'élément suivant après avoir traversé tous les éléments d'une liste sera NULL. Il ne vous dira pas si l'élément pointé par votre pointeur est valide. Voici la façon dont j'utiliser list::end si je vérifie si mes résultats étaient valides ou non:

list<whatever>::iterator item = find(myList.begin(), myList.end(), value); 
if(item != myList.end())... 

Parce que find renvoie le dernier élément de la gamme que vous avez donné à la recherche sur si aucun élément existe . Cela dit, lorsque vous faites &(*something), vous obtenez l'adresse de l'élément dont l'itérateur pointe vers un code parfaitement valide. Si vous pensez que les éléments non valides vont être NULL alors cela fonctionne pour vos fins. Si vous ne savez pas s'ils seront NULL, c'est une autre histoire.

Alors, quel code utilisez-vous? Cela pourrait peut-être nous aider à mieux répondre à votre question.

Edit:

En regardant votre code et vous voir utiliser list::begin() puis vérifier contre NULL est mauvaise à moins que votre liste est une liste de pointeurs que je vous recommande vraiment (ou pointeur comme des objets tels que shared_ptr.) vous utilisez list::empty pour voir si la liste est vide plutôt que myList.begin() != myList.end(). La signification de cela est limpide et devrait être plus facile à maintenir dans le futur.