PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ - this == NULL


Corrail
2005-02-22, 18:54:39
Hallo!

Ich hab eine Frage. Kann ich innerhalb einer Klasse abfragen ob this ein NULL Pointer ist? Mit GCC 3.4.2 geht es aber ist das nur eine Eigenheit vom GCC oder allgemein im C++ Standard drinnen?

thx

Trap
2005-02-22, 19:13:57
Wie rufst du die Methode auf, so dass this ein nullpointer ist?

Corrail
2005-02-22, 19:32:20
Hier ein Beispielcode wie ich mir das ganze vorstelle:


#include <iostream>

using namespace std;

class test
{
public:
void buh()
{
if (this == NULL)
cout << "This IST NULL" << endl;
else
cout << "This ist NICHT NULL" << endl;
}
};

int main()
{
test * x = NULL;
x->buh();
}

Trap
2005-02-22, 19:36:23
Ich bin mir ziemlich sicher dass
0->irgendwas()
nicht erlaubt ist, egal auf welchen Typ Pointer man die 0 wandelt.

Mit Zitaten aus dem Standard kann ich allerdings nicht helfen, hab nämlich keinen.

Edit:
a->x ist äquivalent zu (*a).x und zusammen mit
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_indirection_operator.asp
ergibt es undefiniertes Verhalten.

RLZ
2005-02-22, 19:41:25
Static Methoden können aufgerufen werden, wenn kein Objekt der Klasse existiert...

Ich hab beim Singleton mir damals aber angewöhnt einen static Pointer für die jeweilige Klasse anzulegen.
Ob alle Compiler die andere Methode so einfach mitmachen wage ich mal zu bezweifeln. Vielleicht gehts auch schon mit höheren Optimierungstufen schief.

Hab zwar gegoogelt, aber leider auch nix drüber gefunden...

Trap
2005-02-22, 19:46:33
Static methoden haben kein "this"

Edit:
this == 0 gibt es genausowenig wie Nullreferenzen => http://www.gotw.ca/conv/002.htm

zeckensack
2005-02-23, 07:17:00
Hallo!

Ich hab eine Frage. Kann ich innerhalb einer Klasse abfragen ob this ein NULL Pointer ist? Mit GCC 3.4.2 geht es aber ist das nur eine Eigenheit vom GCC oder allgemein im C++ Standard drinnen?

thxNatürlich kannst du das. this ist in jeder nicht-statischen Memberfunktion verfügbar, also kannst du testen wie du lustig bist.
Ich bin mir ziemlich sicher dass
0->irgendwas()
nicht erlaubt ist, egal auf welchen Typ Pointer man die 0 wandelt.

Mit Zitaten aus dem Standard kann ich allerdings nicht helfen, hab nämlich keinen.

Edit:
a->x ist äquivalent zu (*a).x und zusammen mit
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_pluslang_indirection_operator.asp
ergibt es undefiniertes Verhalten.this == 0 gibt es genausowenig wie Nullreferenzen => http://www.gotw.ca/conv/002.htmErrr ... doch, gibt's. Definiere "nicht erlaubt".#include <iostream>
using namespace std;

class
Bingo
{
public:
Bingo():member(1) {}; //wird nicht aufgerufen ...
int live()const {return(0);}
int die()const {return(member); }
private:
int member;
};

int main()
{
Bingo* pling=0;
cout << pling->live(); //funzt
cout << pling->die(); //crash erfolgt hier
return(0);
}
Völlig legaler Code, insofern dass kein Compiler das verweigern wird.

Ob's tatsächlich schief geht hängt nur davon ab, ob die aufgerufene Methode auch tatsächlich auf ungültigen Speicher zugreift. Wo das in dem Beispiel der Fall ist, steht ja in den Kommentaren.

Deine Äquivalenz tut auch nicht viel zur Sache -- das sähe anders aus, wenn die Dereferenzierung eines Zeigers automatisch eine temporäre Kopie implizierte, tut sie aber nicht. Es ist wirklich äquivalent, dh es passiert nichts, was nicht auch mit dem Operator -> passieren würde.

Grestorn
2005-02-23, 07:40:20
Ob's tatsächlich schief geht hängt nur davon ab, ob die aufgerufene Methode auch tatsächlich auf ungültigen Speicher zugreift. Wo das in dem Beispiel der Fall ist, steht ja in den Kommentaren.
Ist ok so, aber eine Ergänzung sei erlaubt: Das gilt nur, so lange die gerufene Methode nicht explizit oder implizit virtuell ist. Bei virtuellen Methoden wirst Du niemals Glück mit einem NULL-Pointer haben.

Corrail
2005-02-23, 11:03:22
Ist ok so, aber eine Ergänzung sei erlaubt: Das gilt nur, so lange die gerufene Methode nicht explizit oder implizit virtuell ist. Bei virtuellen Methoden wirst Du niemals Glück mit einem NULL-Pointer haben.

Jo, stimmt. Bin dann gestern eh auch noch draufgekommen. Solang du keine virtuellen Funktionen hast geht es, ansonsten bekommst du einen Runtime-Fehler (klar, wenn er nachschaun muss welches Objekt es wirklich ist).

Völlig legaler Code, insofern dass kein Compiler das verweigern wird.

Ja, das man dass der Compiler nicht schreit war mir eigentlich klar ;)
Mir ging es aber um das Runtime-Verhalten, das wie schon gesagt geht außer du verwendest virtuelle Funktionen.
BTW: falls du es noch nicht gesehen hast: ForceWare 75.90 mit GL2.0 und FBO ist geleakt ;)

Trap
2005-02-23, 14:48:12
Errr ... doch, gibt's. Definiere "nicht erlaubt".
Nicht erlaubt heißt für mich, dass der C++ Standard sagt dass es "undefined behavior" ist.

Ich hab keine Lust auf Programme die nur durch Zufall funktionieren.

Chris Lux
2005-02-24, 08:15:48
ForceWare 75.90 mit GL2.0 und FBO ist geleakt ;)
Edit: hinfällig