Comment vérifiez-vous un pointeur invalide?
Mon code actuel, de l'effet de:
if( objectPointer != NULL){
delete objectPointer;
}
ne fonctionne pas parce que les pointeurs sont à invalides nombres hexadécimaux par le compilateur comme:
- 0xbaadf00d
- 0xdeadbeef
etc....
Quelle est donc la meilleure façon de vérifier pour un pointeur non valide avant d'essayer de supprimer l'objet?
source d'informationauteur DShook
Vous devez vous connecter pour publier un commentaire.
Toujours initialiser les pointeurs à NULL (0). De http://www.lysator.liu.se/c/c-faq/c-1.html:
Vous n'avez pas besoin de vérifier non-NULL lors de l'appel de supprimer. Il est explicitement définie à ne rien faire.
Tout bon code que vous écrivez ne seraient pas touchés par ces valeurs étranges le compilateur est de mettre dans votre non initialisée ou déjà libéré de la mémoire. Il met ces valeurs là pour vous aider à trouver les bugs. Ergo, vous avez un bug.
Le meilleur moyen est le paramètre à NULL si elle ne pointe pas vers quoi que ce soit. Globals, les pointeurs dans d'autres espaces de noms, et statique locale pointeurs sont automatiquement initialisés à null pointeurs. Les membres de la classe et normale de la population locale doit être initialisé à NULL manuellement si vous avez besoin de les tester contre NULL (certaines personnes aiment à utiliser
0
à la place. Bien sûr, c'est totalement équivalent).Ensuite, vous pouvez vérifier contre NULL, mais peut aussi passer le pointeur tout de suite à
delete
parce qu'il n'aura aucun effet pour supprimer un pointeur null (garanti par la Norme C++).Vous vous posez la mauvaise question.
Votre pointeurs ne doit jamais être obtenir ces valeurs, en premier lieu. vous ne pouvez pas compter sur le compilateur pour définir un pointeur non valide pour quelque chose. vous devez toujours le faire vous-même en attribuant une valeur NULL.
La meilleure façon de faire un "check pour un pointeur non valide avant d'essayer de supprimer un objet", est de ne jamais essayer de supprimer un objet. Tous les appels à
delete
doit être effectuée dans les destructeurs des objets propres de la pointe-aux données.La bibliothèque standard est plein d'objets qui ne ce droit de propriété, et donc vous devriez n'a presque plus besoin d'écrire vous-même. Essayez
unique_ptr
vector
shared_ptr
ou n'importe quel autre récipient adapté à vos besoins particuliers.trouvé cette après que j'ai posté.