Vererbungsproblem, kein C'tor und D'tor aufruf?
-
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