new/delete
-
hi
Ich hab eine Frage zu dynamischer Speicherverwaltung mit new und delete.
Wenn ich eine Klasse habe und mehrere davon abgeleitete Klassen,
und ich ein Objekt der Klasse als "Container" benutzen möchte (sprich den Speicherbereich zur Laufzeit wechseln möchte),
kann ich ja mit delete nur den Speicherbereich freigeben den ich als letztes benutzt habe.
Beispiel:class A{
...};class B: public A{
...};
class C: public A{
...};main(){
A *a=NULL;
a=new B;
a=new C;
delete a;
}Und der Zeiger a wird automatisch vom Destruktor von der Klasse A freigegeben.
der Speicherbereich von B ist doch dann aber eine Speicherleiche.
Wie kann ich den zur Laufzeit freigeben, ohne delete zu verwenden und gleich das Objekt zu löschen?
-
vielleicht hilft dir ein virtueller destruktor...
-
Außerdem solltest du den bisherigen Speicher auch freigeben, bevor du deinen Zeiger verbiegst (nach dem "a=new C;" hast du keine Möglichkeit mehr, auf das vorher angelegte B-Objekt zuzugreifen).
(besser noch: Du verwendest Smart-Pointer, die kümmern sich selber darum, an der richtigen Stelle delete aufzurufen)
-
Zu jedem new gehört ein delete. Das kannst du dir nicht ersparen. Du willst einfach die Regel brechen/umgehen.
Wenn du dir ein delete sparen willst, dann benutze Smartpointer, die zerstören sich autom. wenn sie nicht mehr gebraucht werden.
Es gibt std::tr1::shared_ptr welcher in den meisten Fällen ausreichend ist. Wenn du kein tr1 hast, kannst du auch Boost herunter laden und dort boost::shared_ptr verwenden. Dann sparst du dir ein delete.