Consente di dire che abbiamo una classeIn che modo C++ memorizza funzioni e oggetti in memoria?
class A
{
int x;
public:
void sayHi()
{
cout<<"Hi";
}
};
int main()
{
A *a=NULL;
a->sayHi();
}
Il codice qui sopra compilare su Turbo C (dove ho testato) e stampa Hi
come output.
Mi aspettavo un incidente perché a
è NULL
. Più sopra se faccio sayHi()
funzione virtuale, si dice
Abnormal temination(Segmentation fault in gcc)
Conosco un sacco di esso dipende dall'implementazione, ma se qualcuno potesse far luce su qualsiasi implementazione o semplicemente dare una visione d'insieme che sarebbe stato davvero bello.
La chiamata di un metodo tramite un puntatore nullo è un comportamento non definito. Tutto può accadere, non deve crollare, ma lo standard lo consente. –
Non un ragazzo C++, quindi questa è una supposizione, ma: il tuo codice non ha bisogno di accedere a nessuna memoria di un'istanza di 'A'. 'sayHi()' non usa il campo 'x', e non è virtuale, quindi non ha bisogno di accedere al vtable per risolvere. Un compilatore C++ dovrebbe effettivamente inserire un controllo per vedere se 'a' è un puntatore valido per causare un errore. – millimoose