In welchem Fall testet man, ob ein NULL-Zeiger vorliegt?
-
Das habe ich mich schon den ganzen Tag gefragt. Möchte mir da evtl. eine/r helfen?
-
skullyan schrieb:
Das habe ich mich schon den ganzen Tag gefragt. Möchte mir da evtl. eine/r helfen?
Hau soviele asserts rein, wie Du magst. Mehr ist mehr.
Und teste nach Funktionsaufrufen, die einen Nullzeiger liefern könnten, falls Du sowas mal hast.
-
Was passiert eigentlich, wenn delete[] auf einen Null Zeiger angewendet wird, der auf ein leeres array zeigt ( T *p = new T [0] )? Undefiniert oder korrekt?
-
delete 0;//null probleme
delete hat ein if eingebaut, und ignoriert einfach die 0.zur anderen frage:
http://learningcppisfun.blogspot.com/2008/02/zero-sized-arrays.html
-
Zum Thema NULL-Zeiger:
Stell dir eine Klasse vor, die nur unter gewissen Umständen Gebrauch von einem sehr großen internen Objekt macht. Dieses Objekt fest als Klassenmember einzubauen wäre in den meisten Fällen reine Verschwendung, daher allokiert man es erst bei Bedarf:class Monster; class UserOfMonster { Monster* theMonster; Monster& getTheMonster() { if (theMonster == NULL) theMonster = new Monster(/*...*/); return *theMonster; } UserOfMonster() : theMonster(0) /*...*/ {} ~UserOfMonster() {delete theMonster;} };
-
pumuckl schrieb:
Zum Thema NULL-Zeiger:
...UserOfMonster() : theMonster(0) /*...*/ {} ~UserOfMonster() {delete theMonster;} };Trotzdem ist das für mich nicht verständlich.
Ich erwarteUserOfMonster() : theMonster(0) /*...*/ {} ~UserOfMonster() {if(theMonster) delete theMonster;} };oder
UserOfMonster() : theMonster(new Monster) /*...*/ {} ~UserOfMonster() {delete theMonster;} };Die Zusatzvereinbarung, daß dieses if innerhalb von delete steckt, verletzt jedes Gefühl für anständiges Programmieren, es ist eine schwere Symmetrieverletzung, stört die Fehlersuche, verschwendet Rechenzeit und ist so ganz und gar nicht C++, daß es mich immr traurig macht, wenn ich das sehen muß.
-
volkard schrieb:
Die Zusatzvereinbarung, daß dieses if innerhalb von delete steckt, verletzt jedes Gefühl für anständiges Programmieren, es ist eine schwere Symmetrieverletzung, stört die Fehlersuche, verschwendet Rechenzeit und ist so ganz und gar nicht C++, daß es mich immr traurig macht, wenn ich das sehen muß.
Verschwendet Rechenzeit? Wo? Die Rechenzeit, die ich verschwende, wenn ich das if explizit (nochmal) einbaue? Oder die Rechenzeit die verbraten wird um Speicher zu allokieren, nur damit der Pointer nicht 0 ist?
Oder falls du dich auf das Sprachdesign an der Stelle beziehst: Wenns nicht eingebaut wäre, müsste man es so gut wie immer aufrufen. Die Symmetrie ist dadurch gegeben, dass eben nicht explizit abgefragt werden muss genauso wie bei new nicht abgefragt werden muss ob evtl. ein Nullpointer zurückkam.
Wo es die Fehlersuche stört seh ich auch nicht.Davon mal abgesehen ist
UserOfMonster() : theMonster(new Monster) /*...*/ {}nicht exceptionsicher. Lass in /.../ einen Memberkonstruktor seine Excepton werfen und voilá, Speicherleck. Sowas ist es was mich jedesmal traurig macht.
-
volkard schrieb:
Die Zusatzvereinbarung, daß dieses if innerhalb von delete steckt, verletzt jedes Gefühl für anständiges Programmieren, es ist eine schwere Symmetrieverletzung, stört die Fehlersuche, verschwendet Rechenzeit und ist so ganz und gar nicht C++, daß es mich immr traurig macht, wenn ich das sehen muß.
Ich würde es einfach nur als "sinnvoll" bezeichnen.
Symmetrieverletzung... scheint hier jetzt in Mode zu kommen auf alles "Symmetrie" als Argument draufzuhauen. Ist aber kein Argument, ist ein Prinzip. Und dass diesem Prinzip zu gehorchen überall Sinn macht, das stelle ich ganz entschieden in Abrede. Und mehr: ich bestreite sogar, dass es die "Symmetrie" verletzt.
Kannst du begründen warum du a) denkst dass es die Symmetrie verletzt, und b) warum das in diesem speziellen Fall "schlecht" sein sollte?
Stört die Fehlersuche: Ansichtssache. Wenn man es als Fehler ansieht, delete 0 zu machen, und solche "Fehler" finden will, dann ja. Allerdings kannst du immer noch "assert(p); delete p;" schreiben, wenn du das andere Verhalten haben willst. Sehe gerade den Vorteil nicht, den man durch ein "delete 0 = Fehler" hätte.
Verschwendet Rechenzeit... OK. Ja. Und? delete ist langsam. Auch die schnellste Implementierung ist langsam. Mich ganz persönlich stört da ein mickriges if nicht. Macht keinen nennenswerten Unterschied in diesem Fall.
-
@pumuckl: deswegen macht man aus theMonster ja auch einfach einen scoped_ptr

----
Aber ne, das verletzt ja wieder die Symmetrie!
Kann ja nicht sein dass man wo "new" schreibt und garkein "delete"!!!einself

