delete funktioniert nicht?!?
-
hallo,
also ich hab folgendes problem:class base { public: virtual int a(){return 0;}; }; class derived : virtual public base { public: int a(){return 1;}; }; int main { base *Q = 0; Q = new derived(); std::cout << Q->a() << std::endl; // liefert 1, wie gewollt if(Q) delete(Q); //hier stürzt das programm dann ab return 0; }kann mir jmd erklären warum das nicht funktioniert?
-
Hinter dem Base* pointer liegt ein derived-Objekt. Da Base* aber keinen virtuellen Destruktor hat, wird der Destruktor von derived nicht aufgerufen. polymorphes delete mit nichtvirtuellen Destruktoren erzeugt undefiniertes Verhalten...
-
also wäre damit abhilfe geschaffen?
class base { public: base(){}; virtual ~base(){}; virtual int a(){return 0;}; }; class derived : virtual public base { public: derived(){}; virtual ~derived(){}; int a(){return 1;}; };
-
FreakyBKA schrieb:
also wäre damit abhilfe geschaffen?
Eine Möglichkeit, diese Frage zu beantworten wäre, den Code durch den Compiler zu jagen und zu schauen obs immernoch abstürzt. Das wäre dann ein praktisches Indiz dafür, dass damit das Problem tatsächlich gelöst ist.
Eine andere Möglichkeit wäre, den Code zu nehmen, den Standard zu nehmen, und fein säuberlich zu beweisen, dass der Code dem Standard entsprechend korrekt ist und das tut was du erwartest. Das wäre dann die theoretische Seite der Angelegenheit.
Es wird dir allerdings beides selbst überlassen, weil du den praktischen Test genausogut selbst ausführen kannst und sich für den theoretischen Beweis niemand die Mühe machen wird.
Hättest du natürlich auch selbst drauf kommen können, deshalb wundert mich die Frage etwas

-
FreakyBKA schrieb:
if(Q) // unnötig delete(Q); //hier stürzt das programm dann ab return 0; }das
if(Q)ist nicht nötig, weil delete(0) nicht schadet.
hat mit dem problem nichts zu tun, nur ein allgemeiner hinweis.
-
der leere destruktor in derived ist auch nicht mehr zwingend erforderlich, der in base reicht.
-
müsste damit das if überhaupt funktioniert nicht die geschwungenen Klammern da stehen ? also so:
if(Q){}und ich meine es wird auch nix geprüft
if(Q==jenachvariablentyp)oder lieg ich da falsch ?
-
Sobald nach dem If nur eine Codezeile folgt welche zu der If gehört sind kein {} nötig
if(booleanWert) std::cout<<"Allet Klar!"<<std::endl; std::cout<<"Nichts klar"<<std::endl;Hier wird nur die "Allet Klar" zeile ausgeführt wenn das If true liefert.
-
Tim06TR schrieb:
müsste damit das if überhaupt funktioniert nicht die geschwungenen Klammern da stehen ?
Wie Firefighter es erklärt hat. Man kann es sich vielleicht aber besser so vorstellen:
if(p) p->do_something(); // Es wird also alles ausgeführt, wenn p ungleich 0 ist, bis zum nächsten Semikolon.Tim06TR schrieb:
und ich meine es wird auch nix geprüft
In C++ ist alles ungleich 0 wahr und alles was 0 ist falsch.
if(p) { } // ist somit das Selbe wie: if(0 != p) { }Grüssli