2010-06-18 13 views
9

Mi chiedevo se v'è la possibilità di catturare gli errori come questo in C++:È possibile rilevare errori di puntatore non validi in C++?

object* p = new object; 

delete p; 
delete p; // This would cause an error, can I catch this? 
  1. posso controllare se il puntatore è valido?
  2. Posso rilevare qualche eccezione?

So che è possibile impostare il puntatore p su NULL dopo la prima cancellazione dell'oggetto. Ma immagina solo che non lo faresti.

+5

La domanda non è come recuperare da tali errori, la domanda è come non renderli in primo luogo. (Lo stesso vale per impostare i puntatori su 'NULL'. Perché un puntatore in ambito che non si riferisce a qualcosa?) C++ viene fornito con molti costrutti che impediscono di gestire manualmente i puntatori (e altre risorse). Nell'ultimo decennio del fare C++, raramente ho dovuto "cancellare" manualmente qualsiasi cosa. – sbi

+0

@Job Giusto sei - dovresti aver estratto il riferimento. –

risposta

10

Non penso che sia possibile rilevare questo tipo di errore perché penso che il risultato sia un comportamento non definito. Potrebbe non fare nulla, potrebbe bloccarsi, potrebbe solo danneggiare la memoria e causare un problema in futuro.

Se hai trovato che ha fatto qualcosa di specifico con il tuo compilatore corrente, puoi provare a gestirlo, ma potrebbe fare cose diverse in debug e release, e di nuovo diverso quando aggiorni la versione del compilatore.

È stato suggerito di impostare il puntatore su null, ma penso che sarebbe meglio usare puntatori intelligenti e non eliminarli affatto.

+2

Usa puntatori intelligenti - fine, davvero. – Puppy

1

Purtroppo non posso parlare per il mondo Windows, ma so che ci sono alcuni strumenti nel mondo Unix che fa questo per voi (a runtime)

L'idea è quella di implementare le funzioni di allocazione della memoria insieme alcuni controlli extra. Si può dire alla libreria di interrompere il processo quando viene trovato un problema e si può trovare il problema osservando la traccia dello stack. libumem su solaris è un esempio di questo.

Sono sicuro che ci devono essere cose simili sulla piattaforma Windows.

Esistono altri strumenti che eseguono l'analisi del codice statico, che consente di individuare i problemi prima di eseguire il codice. Coverity è un esempio, e penso che funzioni anche su Windows. Siamo riusciti a trovare alcuni potenziali problemi con le cover. Sfortunatamente, non è gratuito. Tuttavia, le versioni di valutazione dovrebbero essere possibili.

+0

Un altro strumento utile (non libero) è Purify. È un correttore dell'accesso alla memoria di runtime e funziona molto bene, raccogliendo tutti i tipi di potenziali problemi. Se sei su Linux, ci sono anche valgrind ed efence. –

2

Perché nessuno desidera utilizzare puntatori intelligenti come boost::shared_ptr? Se lo usi, puoi dimenticare delete -operator. ;)

Problemi correlati