4 Stimmen

Wie funktioniert dieser C++-Code? Nicht initialisierter Zeiger

Möglicher Duplikat:
Was passiert, wenn ich eine Member-Funktion auf einen NULL-Objektzeiger aufrufe?

class A {
  public:
    void foo() { cout << "Work";}
    void bar() { this->foo(); }//neue Bearbeitung, funktioniert auch!
};

class B {
  private:
    A *a; //nie initialisiert
  public:
    A& getA() {
      return *a;
    }
};

void SomeFunction() {
    B *b = new B();
    B& bRef = *b;
    bRef.getA().bar();//bearbeitet
    delete b;
}

Ich habe SomeFunction() aufgerufen, ohne "a" zu initialisieren, und es druckt trotzdem korrekt "Work" aus. Ich verstehe nicht, warum, es hätte mit einem Segmentation-Fehler aussteigen sollen!

10voto

Henrik Punkte 22966

Dies ist ein undefiniertes Verhalten, aber es wird auf den meisten Compilern funktionieren, da foo nicht virtuell ist und den this Zeiger nicht verwendet.

5voto

GazTheDestroyer Punkte 20048

Denken Sie daran, dass Klassen nur eine Konstruktion von C++ sind. Bei der Kompilierung sind alle Klassenmethoden nur statische Methoden, die einen versteckten this-Parameter akzeptieren.

Angenommen, Ihre foo()-Methode referenziert nie auf Datenmember, benötigt sie diesen also nie und läuft einwandfrei, auch bei einem nicht initialisierten Wert von this.

3voto

Kaz Dragon Punkte 6406

Semantisch,

o.f(args)

ist dasselbe wie

f(o, args)

Also könnte die Funktion, die du aufrufst (A::foo()), gleichwertig sein zu:

void A_foo(A* pthis)
{
    cout << "Arbeit";
}

Wie du sehen kannst, wird pthis nie dereferenziert, sodass kein ungültiger Speicherzugriff erfolgt. Selbst wenn du this->foo() eingibst, handelt es sich um genau den gleichen Aufruf, und this muss nicht dereferenziert werden.

Zumindest ist dies eine übliche Art und Weise, wie ein Compiler dies implementiert. Es ist unbestimmt, was genau passieren könnte, also könnte das Ausführen des Codes auf der Todesstation 9000 stattdessen ein Kätzchen ins All beamen. Denk an die Kätzchen!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X