löschen NULL Pointer
-
mantiz schrieb:
Daraufhin habe ich mir die Abfrage vor dem delete in einigen Dtors mal gespart. Die Folge war dann eine Runtime-Exception, wenn ich kein Objekt für den Pointer erstellt habe, was für mich allerdings ziemlich unlogisch war.
Ist es auch. Die Abfrage bewirkt wirklich nichts. Einen uninitialisierten Zeiger fängt sie auch nicht ab.
-
delete NULL; ist gültig, da passiert nichts, der Fehler lag bei dir wo anders.
-
mantiz schrieb:
Ja, das hab' ich auch gedacht. Daraufhin habe ich mir die Abfrage vor dem delete in einigen Dtors mal gespart. Die Folge war dann eine Runtime-Exception, wenn ich kein Objekt für den Pointer erstellt habe, was für mich allerdings ziemlich unlogisch war. Naja, hab' die Abfrage wieder eingebaut. Im Nachhinein habe ich dann mal hier im Forum gelesen, dass zumindest der VC-Compiler (keine Ahnung welche Version) Pointer wohl mit 0xCDCDCD initialisiert wird, wenn man im Debug-Mode kompiliert. Ich glaube so war's.
Ich verwende zwar Codeblocks mit MinGW, aber ich habe mir das Phenomän dann so erklärt.Es gibt einen unterschied zwischen einen uninitialisierten Zeiger und einen Zeiger mit dem Wert 0. Ein nicht initialisierter Zeiger hat einen zufälligen Wert. Wenn ich keinen explizit angebe, steht häufig 0 drin und eine delete funktioniert meistens. Daher setzt VC den Pointer im Debug-Mode auf einen anderen Wert, damit das Programm beim delete möglichst immer abstürzt, damit dieser Fehler zuverlässig auftritt und damit leichter zu finden ist.
Pointer sollte man entweder gar nicht verwenden oder immer initialisieren. Wenn dabei kein Objekt angelegt werden soll, dann auf den Wert 0.
Übringens sollte man wirklich 0 und nicht NULL verwenden. NULL wird in C verwendet und hat unter C++ nichts zu suchen.
Wie ich oben angedeutet habe, sollte man Pointer sowieso vermeiden. Objekte sollten auf dem Stack oder in STL-Containern oder ähnlichem gehalten werden. Wenn es wirklich notwendig ist, sollte man smart pointer einsetzen. Damit wird der Code robust und exceptionsafe und verhindert memory-leaks.
Tommi
-
Übringens sollte man wirklich 0 und nicht NULL verwenden. NULL wird in C verwendet und hat unter C++ nichts zu suchen.
Na ja, ein/der Grund, NULL nicht zu verwenden, ist die Vermeidung von Makros wie NULL eines ist. Aber d.h. nicht, dass NULL C-only wäre.
-
GPC schrieb:
Übringens sollte man wirklich 0 und nicht NULL verwenden. NULL wird in C verwendet und hat unter C++ nichts zu suchen.
Na ja, ein/der Grund, NULL nicht zu verwenden, ist die Vermeidung von Makros wie NULL eines ist. Aber d.h. nicht, dass NULL C-only wäre.
NULL existiert in C++ ebenso wie in C, kein Grund es _nicht_ zu verwenden. Man kann in C++ zwar auch einfach 0 schreiben, aber bei nem NULL weiß jeder, dass es sich hier um nen Zeiger handelt, bei 0 könnte, das auch nur irgendeine integrale Zahl sein.
-
In einem guten Code sollte die Semantik der 0 offensichtlich sein.
Im Uebrigen empfiehlt Stroustrup in seinem Buch auch 0 statt NULL.
-
Aber schrieb:
Man kann in C++ zwar auch einfach 0 schreiben, aber bei nem NULL weiß jeder, dass es sich hier um nen Zeiger handelt, bei 0 könnte, das auch nur irgendeine integrale Zahl sein.
Falsche Schlussfolgerung. Bei NULL "weiß" jeder, dass es ein Zeiger ist, dabei ist es trotzdem nur eine Zahl, und genau das ist eigentlich der einzige Grund, es nicht zu verwenden.
-
Die Winapi ist ein Paradebeispiel, wo eine Unterscheidung zwischen NULL und 0 bei den Parametern die Lesbarkeit drastisch erhöht. Oft hat man dort mehrere Integer und Zeiger bei einem Funktionsaufruf, welche man mit 0 (Integer) und NULL (Zeiger) ausfüllt, da man die Funktionalität nicht braucht.
-
Aber schrieb:
Die Winapi ist ein Paradebeispiel, wo eine Unterscheidung zwischen NULL und 0 bei den Parametern die Lesbarkeit drastisch erhöht.
Naja, WinAPI ist ja auch nicht gerade ein Paradebeispiel für Übersichtlichkeit und gutem Stil.
Zumal es keine C++ API ist.
Ich halte übrigens weder von 0 noch NULL in Verbindung mit Nullzeigern recht viel. Deshalb verwende ich eine Nullzeigerklasse. Evtl. kommt im nächsten Standard ja ein null_ptr Schlüsselwort oä. Dann lässt sich zumindest NULL recht einfach ersetzen.
-
Wurde zwar schon zigmal gepostet, passt aber grad:
http://public.research.att.com/~bs/bs_faq2.html#null