2009-06-14 8 views
14

Je suis bien conscient de la laideur de cette question, je voudrais encore savoir s'il est possible:Comment vérifier si un pointeur est valide?

Lorsqu'un programme tente de lecture/écriture à un pointeur non valide (NULL, bloc non alloué, etc ') fenêtres plante l'application avec une exception de violation d'accès.

La question est, est-il un moyen de vérifier wether ce pointeur va générer une exception avant d'essayer de l'utiliser, ou bien, est-il un moyen d'attraper cette exception?

+0

Similaire à http://stackoverflow.com/questions/683059/how-to-validate-lpvoid-to-bad-ptr/683085#683085 – Michael

+0

Similaire à http://stackoverflow.com/search?q=IsBadReadptr – ChrisW

Répondre

7

Le meilleur pari si vous devez utiliser des pointeurs premières est de vous assurer qu'il est soit un pointeur valide ou 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 prendre ce genre de choses avec structured exception handling (SEH).

Cela dit, SEH is a bad idea.

0

Je ne sais pas sur Windows, mais * nix vous pouvez installer un gestionnaire de SIGSEGV pour intercepter l'exception.

+0

Sous Windows, vous pouvez coder un gestionnaire d'exceptions structurées pour intercepter l'exception. – ChrisW

+0

La gestion des signaux n'est pas spécifique à * nix: elle fait partie de la bibliothèque standard ISO-C – Christoph

+0

Cela n'aide pas beaucoup: une fois le gestionnaire SIGSEGV terminé, l'exécution du programme revient exactement à la même position que la source du signal. . Sauf si vous ne sortez pas à l'intérieur de votre gestionnaire de signal, vous allez créer une boucle sans fin. Donc, en général, c'est une mauvaise idée d'attraper SIGSEGV. – lumpidu

3
+0

Je sais qu'il y a IsBadRead/WritePtr, n'a pas pu trouver des versions valides. Cependant, MSDN dit qu'ils sont obsolètes –

+0

@Hammer: Désolé, je voulais dire "Mauvais", maintenant corrigé. Ils sont considérés comme une mauvaise forme parce qu'ils ne sont pas sécurisés, mais ils sont ce qui se rapproche le plus de ce que le PO demande. – RichieHindle

7

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

+2

De MSDN: "Important: Cette fonction est obsolète et ne doit pas être utilisée.Malgré son nom, il ne garantit pas que le pointeur est valide ou que la mémoire pointée est sûre à utiliser." –

+0

Marteau, oui, ils sont marqués comme obsolètes et l'article auquel je suis lié explique pourquoi. Qu'est-ce que vous essayez de réaliser, de toute façon? – avakar

5

Vous pouvez certainement tester si le pointeur est NULL!

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

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

10

attraper ce genre d'erreurs se penche sur les symptômes et non la cause racine.

Les idiomes suivants travailleront sur toute 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 indirecting il

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

  • attention de l'objet des questions de propriété lors du passage des pointeurs vers d'autres fonctions

Questions connexes