web-dev-qa-db-fra.com

Comment vérifier si un pointeur est valide?

Je suis bien conscient de la laideur de cette question, j'aimerais toujours savoir s'il est possible:

Lorsqu'un programme essaie de lire/écrire à un pointeur non valide (bloc NULL, non alloué, etc.) Windows bloque l'application avec une exception d'une violation d'accès.

La question est, est-ce qu'il y a un moyen de vérifier ce pointeur générera une exception avant d'essayer de l'utiliser, ou bien, existe-t-il un moyen d'attraper cette exception?

21
Hammer

Attraper ce type d'erreurs aborde les symptômes, pas la cause fondamentale.

Les idiomes suivants travailleront sur n'importe quelle plate-forme:

  • initialiser tous les pointeurs à zéro

  • si vous ne pouvez pas garantir un pointeur est valide, vérifiez qu'il est non-0 avant de l'indirecter

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

  • faites attention aux problèmes de propriété d'objet lorsque vous passez des pointeurs à d'autres fonctions

12
laalto

Il existe des fonctions IsBadReadPtr et IsBadWritePtr qui pourrait faire ce que vous voulez. Il y a aussi n article qui explique pourquoi vous ne devriez pas les utiliser.

8
avakar

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 diverses API aux pointeurs de test, mais comme d'autres l'ont souligné, les utiliser peut être problématique.

5
anon
4
RichieHindle

Je pense que vous recherchez quelque chose comme Isbadreadptr.

Documentation:

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

1
Suvesh Pratapa

Je ne connais pas sur Windows, mais dans * Nix, vous pouvez installer un gestionnaire de signal SIGSEGV pour intercepter l'exception.

0
PaV