Winzige Frage zu einem Ausdruck
-
Hallo, als C++-Anfänger habe ich eine winzige Frage zu einem Ausdruck, da ich gerade einen Code von C++ nach VB.NET portiere:
if (! pNode) { // foo }Wann wird in diese Schleife gesprungen, wenn pNode wie aussieht?
Grüße, Max
-
pNode ist ein Pointer, richtig? In dem Fall greift die mögliche Konvertierung von void* nach bool(bzw. int) - dabei wird NULL als false und jeder andere Pointer als true gedeutet.
Also springt du letztlich in die Abfrage (if ist keine Schleife!!), wenn pNode == NULL ist (also auf kein gültiges Objekt zeigt).
-
Alles klar, dann liege ich mit meinem
If IsNothing(oNode) = True Then ' foo End Ifja genau richtig.
Achja, es handelt sich selbstverständlich um keine Schleife sondern um ein If-Konstrukt. ; )Grüße
-
pNode ist eine Adresse. *pNode ist die Dereferenzierung der Adresse, liest also den Wert an der Adresse aus.
pNode kann z.B. auf irgendeine Adresse zeigen. Auch NULL (0) ist eine Adresse, die aber als "nicht genutzt" verwendet wird. D.h., dass wenn ein Pointer die Wert 0 / NULL hat, dass der Pointer auf "nichts" zeigt.
Daher ist es wichtig, einen Pointer immer auf NULL zu setzen, nachdem den Speicher, auf den er gezeigt hat, wieder freigegeben hat.
Ansonsten kommt es beim Dereferenzieren zu undefiniertem Verhalten:
// Irgendwo pNode = new Node; // ... später irgendwo if (irgendwas_tritt_ein()) { delete pNode; pNode = NULL; } // ... noch später if (pNode) // pNode zeigt auf NULL, d.h. der Block wird NICHT ausgeführt (pNode == NULL == 0 == false) { pNode->DoIt(NOW); // Wäre pNode bereits gelöscht worden, aber NICHT auf NULL gesertzt worden, gäb's hier ein Problem. } if (!pNode) // Tue das nur, wenn pNode == NULL ist // fooPS.: Nach Bjarne Stroustrup ist die Verwendung von NULL angeblich unschön.