Zeiger = 0;
-
dot schrieb:
wtf?
std::unique_ptr<Data> p(new Data());done
Warum ratet ihr denn alle von der manuellen Verwendung delete's ab? delete ist doch nur ein Operator der den Destruktor eines Objekts aufruft, welcher es zerstört, oder ist er einfach nur so in C++ eingebunden, um den Quell-Code schöner zu machen?!
Bitte entschuldigt mich wenn ich mit dieser - von euch aus gesehen - Dummheit rumspamme, aber ich erkenne den Sinn eurer Ratschläge nicht, warum soll delete seine Arbeit nicht erfüllen können?
Bitte erleuchtet doch meine dummen Gedanken
-
RussianTux schrieb:
Warum ratet ihr denn alle von der manuellen Verwendung delete's ab?
Weil es fehleranfällig ist und den Code komplizierter macht. Wenn du mehrere Return-Pfade oder sogar Exceptions hast und alles korrekt freigeben musst, wird das schnell die Hölle.
RAII ist die Lösung, um Ressourcen sicher und sauber freizugeben.
std::unique_ptrzum Beispiel implementiert simples RAII für Zeiger.RussianTux schrieb:
oder ist er einfach nur so in C++ eingebunden, um den Quell-Code schöner zu machen?!
Ne, er wird auf Low-Level-Ebene gebraucht. Eben um solche Dinge wie Smart-Pointer zu schreiben. Aber der durchschnittliche Benutzer implementiert solche Funktionalität nicht, und kommt entsprechend gut ohne
deleteaus.
-
[quote="Nexus"]
RussianTux schrieb:
Warum ratet ihr denn alle von der manuellen Verwendung delete's ab?
Weil es fehleranfällig ist und den Code komplizierter macht. Wenn du mehrere Return-Pfade oder sogar Exceptions hast und alles korrekt freigeben musst, wird das schnell die Hölle.
Letzte Frage bezüglich delete: Welche Fehler kann dieser Operator denn genau verursachen? Worin besteht die Gefahr der Nutzung dieses Operators?
-
Dass man es vergisst (zu jedem new gehört ein delete), und man sich dadurch ein Speicherleck einfängt.
Dass man ein delete macht, den Zeiger aber später noch braucht, man auf "!zeiger" prüft - dummerweise vergessen hat zeiger nach dem delete auf 0 zu setzen.
Dass Zeiger herumgereicht werden, auch in anderen Objekten gespeichert, und man ein delete auf den Zeiger macht, obwohl das Objekt dahinter noch anderswo benötigt wird (Anwendungsfall shared_pointer).
Usw.Halt alles was durch Nachlässigkeit, Faulheit, Unwissenheit, ausreichend hohe Komplexität, schlecht stehende Sterne, ... verursacht werden kann.
Es hat schon seinen Grund, warum sich Leute Gedanken über generische schlaue Zeiger machen.
-
Ich hab eine kleine Aufgabe für dich:
void foo() { int* x = new int; if (hell_yeah()) goto get_santa; // ... a: if (bla) return; if (solo) throw std::runtime_error("i have a bad feeling about this"); // ... return; get_santa: if (hohoho()) { x = new int(42); goto a; } }Füge in diese Funktion alle deletes ein, die notwendig sind, damit der int, auf den x zeigt, immer und unter allen Umständen freigegeben wird.
-
dot schrieb:
Füge in diese Funktion alle deletes ein die notwendig sind, damit der int auf den x zeigt immer und unter allen Umständen freigegeben wird.
Füge in diesen Satz alle Kommas ein, die notwendig sind, damit er immer verstanden wird und korrekt ist.
SCNR

-
check (hoffentlich richtig)

-
Perfekt

-
dot schrieb:
Ich hab eine kleine Aufgabe für dich:
void foo() { int* x = new int; if (hell_yeah()) goto get_santa; // ... a: if (bla) return; if (solo) throw std::runtime_error("i have a bad feeling about this"); // ... return; get_santa: if (hohoho()) { x = new int(42); goto a; } }Füge in diese Funktion alle deletes ein, die notwendig sind, damit der int, auf den x zeigt, immer und unter allen Umständen freigegeben wird.
void foo() { int* x = new int; if (hell_yeah()) goto get_santa; // ... a: delete x;///Erstes if (bla) return; if (solo) throw std::runtime_error("i have a bad feeling about this"); // ... return; get_santa: if (hohoho()) { delete x;///Drittes x = new int(42); goto a; } delete x;///Zweites }Dot, so richtig?
@Kellerautomat: SCNR
jetzt aber. Versprochen.
-
Ne, geh nochmal alle Pfade durch.
Edit: Um genau zu sein, fehlen dir fast alle Pfade.
-
Michael E. schrieb:
Ne, geh nochmal alle Pfade durch.
Jetzt aber

-
Immer noch viiiel zu wenig.
-
Außerdem mach
delete a;keinen Sinn. Und dein erstes delete ist falsch. Wenn das goto nicht genommen wurde, löscht du dort den int, der später aber gebraucht wird.
-
@Dot: Editiert. d
elete x;. Da denk ich gleich drüber nach...
-
void foo() { int* x = new int; if (hell_yeah()) goto get_santa; // ... a: if (bla) { delete x; return; } if (solo) { delete x; throw std::runtime_error("i have a bad feeling about this"); } // ... delete x; return; get_santa: if (hohoho()) { delete x; x = new int(42); goto a; } delete x; }Jetzt?
Ich wusste nicht, dass bei den///....noch der Pointee gebraucht wird
-
Sieht besser aus. Die Frage war aber eigentlich an den Threadersteller gerichtet, in der Hoffnung dass ihm vielleicht klar wird, wieso er in freier Wildbahn nicht mit new und delete herumwerfen sollte...
-
dot schrieb:
Sieht besser aus. Die Frage war aber eigentlich an den Threadersteller gerichtet, in der Hoffnung dass ihm vielleicht klar wird, wieso er in freier Wildbahn nicht mit new und delete herumwerfen sollte...
Hört auf mit C++ zu programmieren, eh wollte ich nicht greade irgendetwas Pro C++ los werden o.O?
-
Hacker: Immer noch längst nicht. Vielleicht sollte man dir sagen, dass die Aufgabe nicht lösbar ist. Findest du heraus, warum das so ist?
-
void a(int* x) { if (bla) return; if (solo) throw std::runtime_error("i have a bad feeling about this"); } void get_santa(int* x) { if (hohoho()) { int* tmp = new int(42); delete x; x = tmp; a(x); } } void foo() { int* x = new int; try { if (hell_yeah()) get_santa(x); } catch(...) { delete x; throw; } }
-
Michael E. schrieb:
Hacker: Immer noch längst nicht. Vielleicht sollte man dir sagen, dass die Aufgabe nicht lösbar ist. Findest du heraus, warum das so ist?
Nein, ich schäme mich. Vielleicht, weil sie lächerlicher Spaghetticode ist?
Ich hab jetzt nicht lange dran gesessen... aber ich glaube alles ist so Ok...?
@Kellerautomat: Wieso Pufferst du da? Du brauchst dochtmpgar nicht.