Templates und deren Grenzen
-
Wenn es nur einen Pointer und c gibt kann man auch einfach die Initialisierungsreihenfolge umdrehen. Dann wird aptr erst nach dem Konstruieren von c alloziert und du hast kein Speicherleck mehr.
-
Braunstein schrieb:
Wenn es nur einen Pointer und c gibt kann man auch einfach die Initialisierungsreihenfolge umdrehen. Dann wird aptr erst nach dem Konstruieren von c alloziert und du hast kein Speicherleck mehr.
Stimmt. Allerdings musst du dafür die Reihenfolge der Memberdeklarationen entsprechend ändern. Und wenn du ein paar Wochen später zu dem Schluss kommst dass da noch ein Member in die Klasse muss, hängst du den hinten ran, dessen Ctor schmeißt und - juhu. Wieder Speicherleck. Sowas macht man entweder richtig und robust oder man lässts gleich bleiben.
-
pumuckl schrieb:
Braunstein schrieb:
Wenn es nur einen Pointer und c gibt kann man auch einfach die Initialisierungsreihenfolge umdrehen. Dann wird aptr erst nach dem Konstruieren von c alloziert und du hast kein Speicherleck mehr.
Stimmt. Allerdings musst du dafür die Reihenfolge der Memberdeklarationen entsprechend ändern. Und wenn du ein paar Wochen später zu dem Schluss kommst dass da noch ein Member in die Klasse muss, hängst du den hinten ran, dessen Ctor schmeißt und - juhu. Wieder Speicherleck. Sowas macht man entweder richtig und robust oder man lässts gleich bleiben.
Naja. Das hast du bei deiner Variante 1 auch. Das "einzig" robuste, was man machen sollte, ist eine RAII Klasse zu benutzen. Dann hat man Ruhe.
-
Hihi.
Mal sehen wie lange es dauert bis auch in diesem Thread die alte RAII Debatte ausbricht
*pfeiff, daumen dreh und wart*
-
pumuckl schrieb:
B1() : aptr(0), c() { try { aptr = new a(); } catch(...) { /* delete alle pointer */ } }Anders hab ichs doch nun auch nicht gemacht!?
Jopp - das try / catch im CTor zusätzlich noch mal zu haben war vermutlich wirklich unnötig - also hab ich jz nur noch einen Funktions-Aufruf im CTor...bb
-
Wieso wird eigentlich immer
shared_ptrals Smart Pointer vorgeschlagen? Je nachdem bietet er nur unnötige Funktionalität. Meines Erachtens hat er etwa den gleichen Status wiestd::vector- einfach mal verwenden, solange man nichts Besseres weiss oder sich nicht darum kümmern will.Wenn die Klasse nicht kopiert oder zugewiesen werden muss, kann man auch
scoped_ptrverwenden. Wenn bei Kopien oder Zuweisungen der Besitz übertragen werden soll, stelltauto_ptreine Möglichkeit dar. Ich glaube zwar, die meisten hier wissen das, aber ich wollte es trotzdem mal erwähnen.
-
Was hast du denn gegen boost::shared_ptr bzw. std::vector?
-
hustbaer schrieb:
Was hast du denn gegen boost::shared_ptr bzw. std::vector?
Ich hab nichts gegen sie. Ich finde es nur ein wenig schade, dass sie immer als erstes und meistens auch als einziges erwähnt werden. Häufig habe ich das Gefühl, gerade bei
std::vector, dass man ihn als Anfänger viel zu oft empfohlen bekommt. Selbst denkt man da nicht daran, dass es nochstd::listfür verkettete Listen oderstd::tr1::arrayfür statische Arrays gibt.Gleiches gilt für
shared_ptr: Es ist nicht immer so, dass sich mehrere Instanzen einen Zeiger teilen müssen. Wenn man beispielsweise jede Instanz für sich verwaltet und von den anderen abgrenzt, istscoped_ptrbesser geeignet. Nicht nur wegen des Overheads; man sieht auch gerade, dass das Objekt nicht kopiert werden kann. Beishared_ptrhingegen ist die Gefahr grösser, dass man normal kopiert, sich aber später fragt, warum hinter den beiden Zeigern das gleiche Objekt steht.Naja, das Ganze ist vielleicht ein bisschen weit hergeholt, aber bei mir war es so, dass ich am Anfang kaum Ahnung von STL hatte und einfach immer
std::vectorstatt C-Arrays benutzte (ohne Iteratoren). Mir standen deswegen auch weniger Möglichkeiten offen. Klar, wenn man sich wirklich interessiert, liest man sich auch mehr zur Thematik ein. Trotzdem halte ich es nicht für falsch, die Alternativen auch noch aufzuzählen.
-
Hm. OK.
Ich empfehle shared_ptr und vector weil es die beiden Kandidaten sind die ich zu 90% (mehr wahrscheinlich) verwende.
Und wozu die Kids verwirren wenn sie's vermutlich eh kaum jemals brauchen werden?Und natürlich sollte jeder der sich Programmierer nennen will selbst nachgucken was es so alles in der Standard-Library gibt, bzw. in wirklich bekannten Libraries wie Boost.
-
hustbaer schrieb:
Hm. OK.
Ich empfehle shared_ptr und vector weil es die beiden Kandidaten sind die ich zu 90% (mehr wahrscheinlich) verwende.
Und wozu die Kids verwirren wenn sie's vermutlich eh kaum jemals brauchen werden?Und natürlich sollte jeder der sich Programmierer nennen will selbst nachgucken was es so alles in der Standard-Library gibt, bzw. in wirklich bekannten Libraries wie Boost.
Genau. Und der Vorteil ist, dass, wenn du shared_ptr/std::vector empfiehlst, dann kommt das wahrscheinlich am nächsten zu dem, was die Anfänger überhaupt suchen. Ansonsten kommen dann so Fragen, wie "warum geht das nicht und warum kann ich nicht das und das machen?". Und dann gibts du ihnen so, oder so diese Varianten..
-
Genau

Allerdings muss ich was ich geschrieben habe doch etwas relativieren *g*. Wenn ich den Eindruck habe dass jmd. damit jetzt nicht total überfordert ist, dann finde ich es schon OK darauf hinzuweisen dass es auch andere Container bzw. Smart-Pointer gibt, die für bestimmte Fälle besser geeignet sind.Allerdings bin ich meist einfach zu faul. Und ich sehe es auch nicht als Aufgabe eines Forums jmd. einen Überblick über die Features einer Library oder Programmiersprache zu geben - dafür gibt es Referenz-Dokus, Tutorials und Lehrbücher
