Vererbungsproblem, kein C'tor und D'tor aufruf?
-
Weil es eine Instanz gibt?
Eine Instanz die mit new allokiert wurde?
Weil ein D'tor automatisch beim Blockende aufgerufen werden soll? (Laut Standard?)
-
Wenn du zu dem new in createDevice() auch irgendwo das zugehörige delete
aufgerufen würde, dann wär das auch der Fall. Was bleibt ist eine Speicherleiche.Der Destruktor wird aufgerufen wenn dein Objekt zerstört wird entweder durch das
System oder durch dich selbst (drop()). Ich glaub du verwechselst Ursache und
Wirkung.mfg JJ
-
Ich dachte C'tor muss automatisch beim Erstellen der Instanz aufgerufen werden und der D'tor bei der Zerstörung? (Welche beim Funktionsrumpfende ist)???
-
raw-Pointer (mit new allokiert) werden nicht automatisch freigegeben. Das musst
du schon selbst machen. Damit man sowas auch nicht vergisst verwendet man
üblicherweise Smartpointer bei denen genau dieses Verhalten gegeben ist.mfg JJ
-
Aber es muss doch wenigstens der D'tor aufgerufen werden sowie der C'tor???
-
Der Vererber schrieb:
Aber es muss doch wenigstens der D'tor aufgerufen werden sowie der C'tor???
Ja, aber der Ctor wird in dem fall nur mit new aufgerufen, also musst du den dtor eben auch von hand aufrufen mit delete.
mfg
-
Was muss ich denn machen das er automatisch den D'tor aufruft? Ich mein einen D'tor von Hand aufrufen ist sicherlich nicht im Sinne des Erfinders, oder? Ich dachte die wären zur Speicherfreigabe da?
-
Mit new legst du die Variable auf den Heap, nicht auf den Stack. Du musst den Pointer schon selbst wieder freigeben, halt mit delete. Ne andere Möglichkeit wäre ein smart-pointer, wie z.B. std::auto_ptr, in diesem Fall also:
void bla (void) { IDevice* x = createDevice(); x->draw (); delete x; }
oder:
#include <memory> // ... void bla (void) { std::auto_ptr<IDevice> x = createDevice(); x->draw (); }
-
Wenn du Speicher dynamisch allokierst wird nie automatisch delete aufgerufen.
Du kannst das Problem, wie schon geschrieben, durch Verwendung von Smartpointern
umgehen (auto_ptr oder boost::...).mfg JJ
-
@0xdeadbeef
main.cpp(77): error C2440: 'initializing' : cannot convert from 'IDevice *' to 'std::auto_ptr<_Ty>'
with
[
_Ty=IDevice
]@John Doe
Was issn vorzuziehen? boost oder stl?
-
auot_ptr ist Bestandteil von STL, hat aber einige Mankos. Beispielsweise kein
"arbeiten" mit Arrays, auch ist der Einsatz in STL-Containern nicht möglich.
Boost muss jedoch runtergeladen, installiert und eventuell gebaut werden.mfg JJ
-
Der Vererber schrieb:
Ich mein einen D'tor von Hand aufrufen ist sicherlich nicht im Sinne des Erfinders, oder?
Tust du doch gar nicht, du rufst delete auf.
Ich dachte die wären zur Speicherfreigabe da?
Nein, dafür ist operator delete da. Der Destruktor räumt dein Speicherinhalt vorher leer.
Was issn vorzuziehen? boost oder stl?
Das ist schwer zu sagen, weil keiner der in beiden Bibliotheken vorhandenen Smart Pointer für den gleichen Zweck gebaut wurden. In dem Fall würde ich aber die Factory einen auto_ptr zurückgeben lassen und das zurückgegebene Objekt je nach Verwendung in einem scoped_ptr oder shared_ptr auffangen. Du wirst nicht drumrum kommen, erstmal new/delete allgemein und dann die einzelnen Smart Pointer zu studieren.
-
dummerweise führt delete x; hier auch nicht zum erfolg, da delete im destruktor nochmal aufgerufen wird, also insgesamt zweimal delete mit demselben pointer. das geht ja nun nicht, folglich ist das objekt unzerstörbar
-
0xdeadbeef schrieb:
void bla (void)
{
std::auto_ptr<IDevice> x = createDevice();x->draw ();
}
[/cpp]da c-tor von std::auto_ptr explicit ist, soll man sowas schreiben:
void bla (void) { std::auto_ptr<IDevice> x(createDevice()); x->draw (); }
-
Der Vererber schrieb:
@0xdeadbeef
main.cpp(77): error C2440: 'initializing' : cannot convert from 'IDevice *' to 'std::auto_ptr<_Ty>'
with
[
_Ty=IDevice
]mach mal so
std::auto_ptr<IDevice> x(createDevice()); x->draw ();
da c-tor von std::auto_ptr explicit ist