Hallo allerseits,
ich frage mich aktuell, wie man am geschicktesten mit Objekten umgeht, welche z.B. zu einem weiteren Objekt gehören. Konkreten Beispiel, ich habe eine Klasse A welche eins oder mehrere Objekte der Klasse B beinhalten kann. Klasse A könnte z.B. so aussehen:
Nun könnte append(B *b) wie folgt implementiert werden:
Der erste Fall dürfte der schnellere sein, weil ich hier ja einfach nur einen Pointer speicher, dafür laufe ich Gefahr, dass falls b im aufrufenden Programmteil explizit mit delete gelöscht wird (warum auch immer) und somit die Daten aus dem Buffer korrupt sind.
Im zweiten Fall lege ich eine Kopie von b, womit die Konsistenz der Daten gesichert wird, allerdings habe ich natürlich einen erhöhten Zeitaufwand, da ja eine Deep-Copy des Objekts erzeugt werden muss. Zudem gibt es hier noch ein mögliches Memory Leak (?) wenn der Aufruf mittels
erfolgt, da ich den von "new B();" belegten Speicher, zumindest mit der obigen Methode, nicht mehr freigeben kann.
Gibt es für sowas eine Art "Best Practice" oder muss man das von Fall zu Fall entscheiden, je nachdem, was einem wichtiger ist (Laufzeit vs. Konsistenz vs. Speicherverbrauch)?
ich frage mich aktuell, wie man am geschicktesten mit Objekten umgeht, welche z.B. zu einem weiteren Objekt gehören. Konkreten Beispiel, ich habe eine Klasse A welche eins oder mehrere Objekte der Klasse B beinhalten kann. Klasse A könnte z.B. so aussehen:
Code:
class A {
public:
void append(B *b);
B *getLast();
private:
std::vector<B *> buffer;
}
Nun könnte append(B *b) wie folgt implementiert werden:
Code:
void A::append(B *b) {
buffer.push_back(b);
}
// oder
void A::append(B *b) {
// B besitzt einen Copy-Konstruktor
buffer.push_back(new B(b));
}
Der erste Fall dürfte der schnellere sein, weil ich hier ja einfach nur einen Pointer speicher, dafür laufe ich Gefahr, dass falls b im aufrufenden Programmteil explizit mit delete gelöscht wird (warum auch immer) und somit die Daten aus dem Buffer korrupt sind.
Im zweiten Fall lege ich eine Kopie von b, womit die Konsistenz der Daten gesichert wird, allerdings habe ich natürlich einen erhöhten Zeitaufwand, da ja eine Deep-Copy des Objekts erzeugt werden muss. Zudem gibt es hier noch ein mögliches Memory Leak (?) wenn der Aufruf mittels
Code:
append(new B());
Gibt es für sowas eine Art "Best Practice" oder muss man das von Fall zu Fall entscheiden, je nachdem, was einem wichtiger ist (Laufzeit vs. Konsistenz vs. Speicherverbrauch)?