nicht sicher bei delete
-
Paul Panther schrieb:
Vergessen Sie diese leere eckige Klammer, so meldet Ihnen der Compiler keinen Fehler! Bei Felder von einfachen Datentypen, d.h. keine Objekte, wird der reservierte Speicher auch richtig freigegeben.
Hab' mich auf das Zitat bezogen und es geht ja immoment nur um elementare Datentypen...
... na ich lese da ganz klar eine Warnung, es nicht so zu machen. Immerhin weist er (mit Ausrufezeichen) darauf hin, dass der Compiler nicht warnt und bei primitiven Typen der Fehler evtl. nicht auffällt und nicht als Anleitung, es so zu machen.
Gruß,
Simon2.
-
Hmmm, er sagt ja aber eigentlich eindeutig, dass der Speicherbereich richtig freigegeben wird. Obwohl ich zugeben muss, dass er sich eigentlich widerspricht, weil er ja vorher sagt, dass nach new[] ein delete[] stehen muss.
Bei meinem ersten Post in diesem Thread ging es mir ja auch eigentlich darum, herauszustellen, dass bei dem Beispiel des Threaderstellers meiner Meinung nach kein delete[] stehen muss, sondern dass ein delete[] stehen sollte.
Allerdings bin ich mir jetzt nach dieser Diskussion irgendwie nicht mehr sicher...
-
Der Automechaniker sagt: "Ja, sie sind noch richtig bis hierhergekommen, aber sie sollten mit dem Auto nicht mehr fahren !" ...
ICH würde mich selbst nicht mehr ans Steuer setzen und auch keinem Anderen raten, es zu tun.
Gruß,
Simon2.
-
Informatik ist aber eine Wissenschaft und da sollte man meiner Meinung nach schon mit so Wörtern wie "müssen", "dürfen" und "sollen" anders umgehen.
Die frage ist ja, was passiert, wenn der Automechaniker sagt, dass er für die Reperatur 2000 Euro verlangt und eine Werkstatt zwei Kilometer weiter entfernt verlangt nur 50 Euro. Wenn mir dann der Mechaniker sagt, ich sollte nicht mehr fahren, dann würde ich wahrscheinlich trotzdem noch die zwei Kilometer fahren. Sagt der Mechaniker allerdings, ich darf nicht mehr fahren und muss bei der Polizei 4000 Euro Strafe zahlen, wenn ich trotzdem weiter fahre, dann würde ich es mir schon überlegen.Wollte folgenden Link nur noch mal hinzufügen, da hier im selben Tutorial delete[] für Objektfelder erklärt wird... http://www.cpp-tutor.de/cpp/le11/le11_02.htm#objektfelder
Und hier wird auch wieder nur auf die Destruktoraufrufe aufmerksam gemacht, nicht aber, dass delete und delete[] uterschiedlich viel speicher freigeben würden.Wie gesagt, mir ging es ja nur darum, ob delete und delete[] für Felder von elementaren Datentypen nicht im Endeffekt das gleiche machen (sollten, wenn der Compiler Standardkonform ist)? Ich habs auf jeden Fall immer so verstanden und les' es auch aus diesem Tutorial heraus und auch noch immer aus meinem Buch.
-
Paul Panther schrieb:
Informatik ist aber eine Wissenschaft und da sollte man meiner Meinung nach schon mit so Wörtern wie "müssen", "dürfen" und "sollen" anders umgehen....
OK - langer Rede, kurzer Sinn: Verwendung von delete nach new[] oder von delete[] nach new ist vom Standard nicht abgedeckt => führt zu undefiniertem Verhalten - unabhängig vom Typ.
Wenn Dein Tutorial etwas anderes sagt, verstehst Du es entweder falsch oder es IST falsch (in diesem Punkt). Deine Entscheidung.
Gruß,
Simon2.
P.S.: Ich persönlich stelle ja schon die Grundaussage "für elementare Typen funktioniert das" infrage (auf allen Compilern).
-
Ok, hab mir mal die Mühe gemacht und es direkt im ISO-Standarddokument (oder wie diese Schrift auch immer heißt) nachgeschlagen, und da steht, dass es undefiniert ist.
Hat mich nur verwirrt, weil ich schon öfters das Beispiel (in Einführungen zu c++) gefunden habe, dass delete nach new[] aufgerufen wird, um zu zeigen, dass dann nur für ein Objekt der Destruktor aufgerufen wird. Wahrscheinlich verhalten sich viele Compiler auch so, aber nach ISO-Standard ist es undefiniert, was dann passiert.
Ich schiebe also einfach mal alle Schuld auf Tutorials die so etwas behaupten

(würde ja niemals zugeben, dass ich etwas falsch verstehe
)
-
Paul Panther schrieb:
...
Ich schiebe also einfach mal alle Schuld auf Tutorials die so etwas behaupten ...Da liegt es auch gut !
Es gibt soooooo viele grottige Tutorials, dass es überhaupt ein Wunder ist, dass irgendjemand vernünftig C++ programmieren kann.
Du gibst ja selbst ein Beispiel von "gut gemeint und schlecht gemacht": Da wollen Tutorials zeigen, dass delete nicht zu new[] passt ... und "belegen" das mit einem Verhalten (nur erstes Element wird gelöscht), das gar nicht definiert ist, sondern vielleicht lediglich von dem einen oder anderen Compiler zufällig so auftritt.
Ich denke, "reine Schrifttreue" fällt vielen Autoren unheimlich schwer ... sie wollen eine technische Begründung, warum etwas nicht funktioniert - leider auch da, wo sie nicht sauber geliefert werden kann.Gruß,
Simon2.
-
Simon2 schrieb:
Da liegt es auch gut !
Es gibt soooooo viele grottige Tutorials, dass es überhaupt ein Wunder ist, dass irgendjemand vernünftig C++ programmieren kann.
Da stimme ich dir auf jeden Fall zu! Allerdings halte ich das Tutorial und auch das Buch, welches ich die ganze Zeit meinte ("C++ Lernen und professionell anwenden", das auch hier im Forum öfters mal als sehr gutes Buch beschrieben wird) jetzt nicht für grottig... (auch wenn du die Beiden wahrscheinlich jetzt nicht speziell meintest, wollte ich das zumindest nochmal herausstellen)
Habe eher das Gefühl, dass dies doch ein recht häufiges Missverständnis ist...Ich mein, zum einen schreiben sie ja auch richtig, dass für ein new[] ein delete[] aufgerufen werden muss, zum anderen widersprechen sie ihrer
Aussage, dass sie sagen, dass es ein definiertes Verhalten dafür gibt, wenn man ein "einfaches" delete aufruft.@Simon2
Danke auf jeden Fall, dass du dir die Mühe gemacht hast, auf jeden meiner Beiträge zu antworten.
Das hat mich dazu gebracht es mal offiziell nachzuschlagen, weil ich es sonst einfach nicht geglaubt hätte. (weil ich es schon so oft anders gelesen hatte)Man kann im Leben halt doch nur dazulernen

-
Simon2 schrieb:
dass es überhaupt ein Wunder ist, dass irgendjemand vernünftig C++ programmieren kann.
Das liegt an dem tollen Forum

-
KasF schrieb:
Simon2 schrieb:
dass es überhaupt ein Wunder ist, dass irgendjemand vernünftig C++ programmieren kann.
Das liegt an dem tollen Forum


Gruß,
Simon2.