Domanda

Ho un'applicazione Linux C ++ e mi piacerebbe provare un puntatore oggetto per la validità prima di dereferencing esso. Tuttavia try / catch non funziona per questo su Linux a causa del difetto di segmentazione. Come si può fare?

È stato utile?

Soluzione

Se si dispone di uno scenario in cui molti puntatori in tutta la vostra applicazione fanno riferimento gli stessi oggetti-vita limitata, una soluzione popolare è quello di utilizzare aumentare puntatori intelligenti . Modifica: in C ++ 11, entrambi questi tipi sono disponibili nella libreria standard

Si consiglia di utilizzare shared_ptr per il puntatore (s) che sono responsabili per tutta la durata del vostro oggetto e weak_ptr per gli altri indicatori, che possono diventare non validi. Vedrai che <=> ha la validità verificare che stai chiedendo costruito.

Altri suggerimenti

Un errore di segmentazione non è un'eccezione (come NullPointerException di Java); si tratta di un segnale inviato dal sistema operativo per il processo. Dai un'occhiata alla la pagina di manuale per sigaction per indicazioni su come installare un gestore per il errore di segmentazione (SIGSEGV).

inizializzare il puntatore a NULL. Se dopo un po 'di elaborazione è ancora NULL è valido, altrimenti è valido.

Si potrebbe consentire a un gestore di segnale per SIGSEGV per questo avvenimento. Vedere la pagina man "segnale" per i dettagli. L'altra alternativa è quella di utilizzare i riferimenti che sono garantiti per essere valido. Essa dipende dalla vostra applicazione, naturalmente.

Non c'è modo universale naturale con puntatori grezzo C ++. C ++ presuppone che si terrà traccia di tali informazioni.

Nella maggior parte delle situazioni, è possibile gestire questo, ricordando per impostare puntatori a NULL quando non sono validi. I nuovi indicatori che inizialmente non puntare devono essere impostati su NULL e nuovi oggetti eliminati devono avere i loro puntatori impostato a NULL.

Come si fa a testare il puntatore per la validità? Confronto a NULL?

La cosa migliore da fare è per eseguire il programma sotto Valgrind . Un bug potrebbe essere in un posto molto diverso.

Aggiornamento: Sulla piattaforma Win32 c'è qualcosa di simile __try __except che permette di raggiungere alcune eccezioni. Per quanto ne so non esiste un equivalente Linux per tale funzione Win32.

Se si collega un gestore alla SIGSEGV non c'è molto si può fare oltre a registrare il fatto che l'errore si è verificato e non riescono con grazia. Il vostro programma è in uno stato indefinito quando si verifica questa violazione e, pertanto, non può essere sicuro di continuare il normale funzionamento.

Al di là di controllo per NULL non credo ci sia un modo per verificare se un puntatore è 'valida', nel senso che si sta descrivendo. Durante gli errori di funzionamento normale come questo non dovrebbe accadere in quanto rappresentano un bug, così si dovrebbe desiderare il vostro programma di fallire, anche se con garbo.

I puntatori sono memorizzati in oggetti. Vengono inizializzati nel costruttore, potenzialmente a 0 (NULL). Sono eliminate nel distruttore, possibilmente in assegnazione e raramente in altre funzioni. Quando cancellato in membri diversi dal distruttore, sono immediatamente assegnato un nuovo valore o 0.

In generale, per quanto riguarda l'idea piuttosto strano di "controllare un puntatore non NULL per la validità", dare un'occhiata a questo articolo: http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx (" IsBadXxxPtr in realtà dovrebbe essere chiamato CrashProgramRandomly ")

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top