mi sono imbattuto nel seguente codice di recente:C++ legale/ben definito per chiamare un metodo non statico che non accede ai membri tramite un puntatore nullo?
class Foo
{
public:
void bar();
// .. other stuff
};
void Foo::bar()
{
if(!this) {
// .. do some stuff without accessing any data members
return;
}
// .. do normal actions using data members
}
il codice viene compilato perché i metodi in C++ sono solo funzioni che vengono implicitamente passato un puntatore per 'questo' e 'questo' può essere controllato per essere NULL come qualsiasi altro puntatore. Ovviamente questo codice è confuso e di cattiva pratica anche se non si blocca; sarebbe piuttosto difficile passare attraverso il codice nel debugger, vedere un puntatore NULL sta per avere un metodo chiamato su di esso e quindi non vedere il crash previsto. La mia domanda è: viola lo standard C++ per chiamare SomeFooPtr->bar()
dove SomeFooPtr == NULL
?
Mi sembra che non sia perché l'operatore definito dall'utente-> restituisce un puntatore, il che significa che anche se quel puntatore è NULL non è stato sicuramente dereferenziato (dereferenziare un puntatore NULL sono sicuro che è considerato dallo standard come illegale o indefinito). D'altra parte la semantica dei puntatori grezzi non deve necessariamente corrispondere alla semantica dei puntatori definiti dall'utente - forse l'operatore-> su di essi è considerata una dereferenziazione anche se il compilatore non ne genererà uno.
duplicati: http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined-behav – GManNickG