Korrekte Elementreferenzierung bei std::vector
-
Es geht um Kontrakte. Alle Container der Standard Library sind auf Speicherung von Werten und nicht von Zeiger auf Objekte ausgelegt. Daher empfiehlt es sich nur Objekte direkt oder SmartPointer auf Objekte in einem Container der Standard Library abzulegen, da man so weniger Arbeit hat und nichts übersieht.
class Typ; class Klasse { std:vector<boost::shared_ptr<Typ> > typVektor; public: Typ const* PushTypElement(Typ element) { boost::shared_ptr<Typ> sp (new Typ(element)); typVektor.push_back(sp); return sp.get(); } };Alternativ kann man sich natürlich auch direkt die SmartPointer zurückliefern lassen.
-
KreuzQuer schrieb:
~john schrieb:
Um das Problem zu verdeutlichen
int main () { Klasse A; // Code zum Füllen von A; { Klasse B = A; } // ab hier enthält A nur noch Zeiger auf Datenmüll! } // hier versucht der Destruktor bereits freigegeben Objekte freizugeben!Das ist doch Sache des Copy-Ctor, der natürlich korrekt definiert sein muß wenn man ihn verwenden will.
Nach dieser Argumentation dürfte man ja gar keine Zeiger als Objektvariablen verwenden.ich klink mich hier mal ein, ggf. ist der punkt hier nicht ganz klar
int main () { Klasse A; // Code zum Füllen von A; { Klasse B = A; //hier zeigen die zeiger aus A und B auf die gleichen Obejekte! } //hier wird der dtor von B aufgerufen, was dazu führt das die Objekte zerstört werden // ab hier enthält A nur noch Zeiger auf Datenmüll! weil dotr von B sie //zerstört hat !! } // hier versucht der Destruktor von A bereits freigegeben Objekte freizugeben!