2014-06-08 10 views
5

Qual è il valore booleano che viene restituito quando una chiamata fucntion viene effettuata su un oggetto nullo in C++?valore booleano restituito su una chiamata di funzione a null oggetto

ClassDummy* dummy = NULL; 
if (!dummy->dummy_function(1,2,3)) { 
    // Do Something 
} 

Non dovrebbe restituire un errore in base agli standard C++ 11?

+0

E per rispondere a tutto il tuo futuro "non dovrebbe C++ dirmi che sto facendo qualcosa di sbagliato" domande in anticipo: no. C++ ottimizza pesantemente il caso in cui il tuo programma funziona, a scapito di dire quasi nulla sul caso in cui hai un bug. – user2357112

risposta

2

La chiamata di un metodo tramite un puntatore nullo ha un comportamento non definito. Il codice non è valido, ma il compilatore non è tenuto a dirti che lo è.

Il C++ standard definisce molti casi in cui, anche se il codice non è valido, il compilatore non è tenuto a dare un "diagnostica". In molti casi, il motivo è solo perché è molto difficile per il compilatore determinare se il codice è valido o meno. Nel tuo codice particolare, questo è abbastanza facile, e alcuni compilatori potrebbero in effetti dare un avvertimento a riguardo se usi il giusto livello di avviso. Tuttavia, non sarebbe troppo difficile costruire un esempio più complicato in cui il compilatore non sarebbe facilmente in grado di stabilire se il puntatore era nullo o meno. Standardizzare esattamente quanto complesso deve essere il codice prima che il compilatore non abbia bisogno di dare una diagnosi sarebbe difficile, e probabilmente inutile, quindi è sufficiente lasciare a ciascuna implementazione la decisione.

4

Nella domanda iniziale dummy aveva un valore imprecisato, forse nulla. Tuttavia, l'effetto dopo la modifica non viene modificato: il comportamento è undefined. Non è un errore qualsiasi strumento è necessario per rilevare: è il mandato del programmatore di chiamare le funzioni membro solo su oggetti validi.

+0

Ho cambiato la domanda un po '. Ci sarebbe un errore se il puntatore è esplicitamente contrassegnato come NULL? – ibp73

+4

no. ancora lo stesso. ... e se hai bisogno di chiarimenti sul significato di [non definito] (http://dspace.dial.pipex.com/town/green/gfd34/art/bloopers.html): segui il link! –

+0

@ DietmarKühl, Wow, mi piace piuttosto quello. – chris

5

A meno che lo dummy non sia stato dichiarato nell'ambito dello spazio dei nomi, non è inizializzato e il suo valore non è specificato, vale a dire che può essere o meno null. Il richiamo di una funzione membro su un nullptr o su un puntatore che punta a memoria non valida è comportamento non definito.

Potrebbero get away with the correct result se la funzione di membro si richiama non accede altri membri di dati della classe; in altre parole, se non dereferenzia il puntatore this. Tuttavia, indipendentemente dal fatto che si ottenga o meno il risultato previsto, è comunque un comportamento non definito.

compilatori non sono tenuti a rilevare tali chiamate di funzione non validi. Se fai qualcosa di ovvio, come inizializzare un puntatore all'oggetto su nullptr e quindi richiamare su di esso una funzione membro, potresti vedere una diagnostica dal compilatore, ma questo non è garantito.

2

Provare a dereferenziare un puntatore nullo come questo comporterà il comportamento non definito .

(Tipicamente, un'eccezione core dump o di accesso alla memoria in molti sistemi.)

+2

E in genere sembra funzionare silenziosamente se viene chiamata una funzione membro non virtuale che non accede a '* this'. – hvd

+0

@hvd Ad ogni modo, è malvagio. – songyuanyao

0

Calling funzioni membro non statiche e accesso alle variabili utente non statici dovrebbe produrre un errore.

Alcuni compilatori e ambienti di runtime consentono l'uso delle variabili membro static e delle funzioni membro con un puntatore NULL, ma il comportamento non è ancora definito in base allo standard.

Vedi C++ static const access through a NULL pointer e la risposta accettata per maggiori dettagli.

Problemi correlati