wieso keine Fehlermeldung
-
Hallo,
wieso funktioniert der u.a. Programmteil? Es existiert keine Objektinstanz und die Ausgabe wird fehlerfrei ausgegeben.gruss
foo#include <iostream> class A { public: void MSG() { std::cout << "hello world" << std::endl; } }; int _tmain(int argc, _TCHAR* argv[]) { A *p = NULL; p->MSG(); return 0; }
-
na dann versuch mal in void MSG() auf den this-Pointer zuzugreifen...
p->MSG() wird zu MSG(p) wird zu MSG(NULL);
Da du aber sozusagen den Parameter gar nicht Benutzt (this-Zeiger) gibts keine Probleme.Hier machts BAM!:
class A { private: int m_val; public: void MSG() { std::cout << "hello, world" << std::endl; if(this == NULL) std::cout << "this is NULL" << std::endl; this->m_val = 42; } }; int main() { A *p = NULL; p->MSG(); }
Das erklärt auch, warum der this-Zeiger NULL sein kann
Das Verhalten wird sein:
Ausgabe von "hello, world"
Ausgabe von "this is NULL"
ProgrammabbruchGrüße, Xantus
-
Xantus schrieb:
na dann versuch mal in void MSG() auf den this-Pointer zuzugreifen...
Klar, das ist verständlich, da es kein this , bzw. nirgends eine Objektinstanz gibt
Aber wieso kann ich Klassenfunktionen aufrufen, wobei keine einziges Objekt dieser Klasse instanziiert wurde?
Gruss
foo
-
Da der "this" Pointer nicht benötigt wird um diese Methode aufzurufen. Mach mal die Methode "virtual":
#include <iostream> class A { public: virtual void MSG() { std::cout << "hello world" << std::endl; } }; int _tmain(int argc, _TCHAR* argv[]) { A *p = NULL; p->MSG(); return 0; }
-
Hallo,
virtual ist für mich auch plausibel, Stichwort Polymorphismus.
Vermutlich hat das mit meinen mangelnden Assemblerkenntnissen zu tun bzw. wie der C++-Code in denselbigen umgesetzt wird.
Um es mal mit meinen kleinen Worten zu sagen, es muss ja irgendwo ein Assemblercode existieren, dervoid MSG() { std::cout << "hello world" << std::endl;
entspricht.
Wo existiert nun der Assemblercode bei meinem Beispiel oben und was ändert sich wenn eine Klasseninstanz auf dem Heap erstellt wird? Bei letzteren ging ich davon aus, dass pro Instanz jeweils der komplette Speicherbereich für die Klasse allokiert wird (also mit Fkt-Implementierung), da jede Instanz für sich schliesslich autark ist oder werden bei Funktionen lediglich Fkt-Pointer auf die (einmal vorhanden) Funktionen auf den Heap gelegt? Vlt. kompliziert erklärt, aber ich hoffe es kommt rüber, was ich meine
Gruss
foo
-
Du verwechslest Daten und Code.
Dein Code ist immer fest und liegt im Speicher. Letzten Endes ist dieser Code ein Image einer Datei, dass in den Speicher gemappt wird. Ob die Klasse selbst im Heap oder auf dem Stack liegt ändert den Code nicht. Denn der arbeitet wiederum nur mit einem Zeiger auf die Daten.Dein Klasse hier hat keine Daten. Es gibt sie in dem Sinne gar nicht und das System ist nicht einmal verpflichtet dafür ein Stück Speicher zu allokieren.
Zu dem Daten der Klasse gehört auch eine vftable, die Tabelle für den Zugriff auf die virtuellen Funktionen.
BTW: Dein ursprüngliches Problem this==NULL.
Es ist vom Compiler abhängig ob solcher Code eralubt ist oder nicht. In den MS-C++ Compilern ist this==NULL grundsätzlich erstmal erlaubt.
Man findet oft genug Code wie z.B. in CWnd::GetSafeHwnd, die diesen Fall behandeln.
-
foodax schrieb:
Vermutlich hat das mit meinen mangelnden Assemblerkenntnissen zu tun bzw. wie der C++-Code in denselbigen umgesetzt wird.
Um es mal mit meinen kleinen Worten zu sagen, es muss ja irgendwo ein Assemblercode existieren, dervoid MSG() { std::cout << "hello world" << std::endl;
entspricht.
Ich hab doch bereits geschrieben:
void A::MSG(); // wird zu... void MSG(A* ptr);
somit wird bei
A* p = NULL; p->MSG(); // eigentlich... MSG(p); // aufgerufen, was dann zu MSG(NULL); // wird
der Wert 0 kann dir aber bei der Routine MSG, die ja lediglich aus std::cout << "hello, world" << std::endl besteht, völlig egal sein, du hantierst ja nicht mit dem ersten Parameter.
-
Hallo,
vftable war das Stichwort, was ich oben versucht habe zu vermitteln. Somit ist das für mich jetzt auch erklärbar. Besten Dank euch beiden!
Gruss
foo