2009-06-14 4 views
14

Sono a conoscenza della bruttezza di questa domanda, mi piacerebbe comunque sapere se è possibile:Come verificare se un puntatore è valido?

Quando un programma tenta di leggere/scrivere su un puntatore non valido (NULL, blocco non allocato, ecc ') windows arresta l'applicazione con un'eccezione di violazione di accesso.

La domanda è, c'è un modo per controllare se questo puntatore genera un'eccezione prima di provare ad usarlo, oppure esiste un modo per catturare questa eccezione?

+0

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

+0

simile a http://stackoverflow.com/search?q=IsBadReadptr – ChrisW

risposta

7

La cosa migliore se si deve utilizzare i puntatori prime è quello di assicurarsi che essa sia un puntatore o NULL valida. Quindi puoi verificare se è valido controllando se è uguale a NULL.

Ma per rispondere alla tua domanda, puoi prendere questo tipo di cose con structured exception handling (SEH).

Detto questo, SEH is a bad idea.

0

Non so su Windows, ma in * nix è possibile installare un gestore di segnale SIGSEGV per intercettare l'eccezione.

+0

Su Windows è possibile codificare un gestore di eccezioni strutturato per rilevare l'eccezione. – ChrisW

+0

La gestione del segnale non è * nix-specifica: fa parte della libreria standard ISO-C – Christoph

+0

Ciò non aiuta molto: dopo che il gestore SIGSEGV ha terminato, l'esecuzione del programma ritorna esattamente nella stessa posizione in cui la causa principale del segnale ha avuto origine . A meno che tu non esca dal tuo gestore di segnale, creerai un loop infinito. Quindi in generale è una cattiva idea catturare SIGSEGV. – lumpidu

3
+0

So che ci sono IsBadRead/WritePtr, non ho trovato le versioni valide. Tuttavia, MSDN dice che sono obsoleti. –

+0

@Hammer: Scusa, volevo dire "Cattivo", ora corretto. Sono considerati una cattiva forma perché non sono sicuri, ma sono la cosa più vicina a ciò che l'OP sta chiedendo. – RichieHindle

7

ci sono funzioni IsBadReadPtr e IsBadWritePtr che potrebbero fare quello che vuoi. C'è anche an article che spiega perché non dovresti usarli.

+2

Da MSDN: "Importante: questa funzione è obsoleta e non dovrebbe essere utilizzata. Nonostante il suo nome, non garantisce che il puntatore sia valido o che la memoria puntata sia sicuro da usare." –

+0

Martello, sì, sono contrassegnati come obsoleti e l'articolo che ho collegato spiega perché. Che cosa stai cercando di ottenere, comunque? – avakar

5

Si può certamente testare se il puntatore è NULL!

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

Questo è l'unico test portatile che è possibile eseguire. Windows fornisce varie API per testare i puntatori, ma come altri hanno sottolineato, utilizzarli può essere problematico.

10

La cattura di questo tipo di errori riguarda i sintomi, non la causa principale.

I seguenti idiomi funziona su qualsiasi piattaforma:

  • inizializzare tutti i puntatori a zero

  • se non è possibile garantire un puntatore è valido, controllare che sia non-0 prima indirecting che

  • quando si eliminano gli oggetti, impostare il puntatore a 0 dopo la cancellazione

  • stare attenti di opporsi questioni legate alla proprietà quando passa puntatori ad altre funzioni