Comment vérifier si un pointeur est valide?

Je suis bien conscient de la laideur de cette question, j’aimerais quand même savoir si c’est possible:

Lorsqu’un programme tente de lire / écrire sur un pointeur non valide (NULL, bloc non alloué, etc.), Windows bloque l’application avec une exception de violation d’access.

La question qui se pose est la suivante: existe-t-il un moyen de vérifier si ce pointeur générera une exception avant d’essayer de l’utiliser? Sinon, existe-t-il un moyen de détecter cette exception?

Le meilleur choix si vous devez utiliser des pointeurs bruts est de vous assurer qu’il s’agit d’un pointeur valide ou de la valeur NULL. Ensuite, vous pouvez vérifier si elle est valide en vérifiant si elle est égale à NULL.

Mais pour répondre à votre question, vous pouvez intercepter ce genre de problème avec la gestion structurée des exceptions (SEH) .

Cela étant dit, SEH est une mauvaise idée .

Résoudre ce type d’erreurs concerne les symptômes et non la cause première.

Les idiomes suivants fonctionneront sur n’importe quelle plate-forme:

  • initialiser tous les pointeurs à zéro

  • si vous ne pouvez pas garantir qu’un pointeur est valide, vérifiez qu’il est différent de 0 avant de le indirecter

  • lors de la suppression d’objects, définissez le pointeur sur 0 après la suppression

  • méfiez-vous des problèmes de propriété d’object lorsque vous passez des pointeurs à d’autres fonctions

Il existe des fonctions IsBadReadPtr et IsBadWritePtr qui peuvent faire ce que vous voulez. Il existe également un article qui explique pourquoi vous ne devriez pas les utiliser.

Vous pouvez certainement tester si le pointeur est NULL!

 if ( ptr == NULL ) { // don't use it } 

C’est le seul test portable que vous puissiez faire. Windows fournit différentes API pour tester les pointeurs, mais comme d’autres l’ont souligné, leur utilisation peut être problématique.

IsBadReadPointer / IsBadWritePointer

Je pense que vous cherchez quelque chose comme IsBadReadPtr.

Documentation:

http://msdn.microsoft.com/en-us/library/aa366713(VS.85).aspx

Je ne connais pas Windows, mais dans * nix, vous pouvez installer un gestionnaire de signaux SIGSEGV pour intercepter l’exception.