Impliziter Konstruktoraufruf



  • sqrt(-1) schrieb:

    Ob der Compiler da optimiert? Naja...

    Also Kopierschleifen mit inline Zuweisungsoperatoren sind eigentlich eine Spezialität moderner Compiler 😉



  • Karatekatze schrieb:

    Hallo!

    mal folgendes angenommen:

    vector<Typ> vektor;
    vektor.push_back(Typ());
    

    Was passiert da überhaupt genau?
    ...

    Ich habe das mal selbst durch den Debugger laufen lassen, wobei der Containertyp ein Klassenobjekt ist.
    Nach einem push_back befinden sich dann ZWEI Elemente im Vektor!
    Das Erste wie gewünscht, und das Zweite ist korrupt.

    Also wurde hier das Verhalten scheinbar noch nicht vollends korrekt wiedergegeben, und die Frage nach dem, was denn da genau passiert, bleibt weiter offen.



  • Komischerweise liegt dieses Verhalten nur vor, wenn nicht der standard Ctor benutzt wird.



  • Das Problem liegt in folgenden Fällen vor:

    vector<Typ> vektor;
    vektor.push_back(Typ(parameter));
    
    vector<Typ*> vektor;
    vektor.push_back(new Typ(parameter));
    

    Wieso zum Geier wird hier ein zweites, korruptes Element hinzugefügt?

    Der Code von push_back und allem was dahinter steckt ist viel zu kryptisch geschrieben (was haben die sich gedacht!?), als dass man dies nachvollziehen könnte.



  • Hmm... kann es sein dass _Myend bei einem Container mit einem Elementen nicht definiert ist?



  • off topic

    sqrt(-1) schrieb:

    Wieso zum Geier wird hier ein zweites, korruptes Element hinzugefügt?

    Das englische "corrupt" bedeutet unter anderem auch beschädigt. Kann man das deutsche "korrupt" tatsächlich auch als beschädigt verwenden? Irgendwie klingt das in meinen Ohren falsch.



  • Kommt beides vom gleichem lateinischem Begriff (corrumpere) und hat die gleiche Bedeutung.

    Übrigens ist Größe des Vektors tatsächlich nur eins.
    Nur wird eben unter den genannten Umständen _Mylast und _Myend mit irgend einem zweiten Element belegt.



  • _Mylast und _Myend beginnen mit einem Unterstrich und einem Großbuchstaben. Ihre Verwendung ist ein Privileg des Compilers. Der normale Anwender sollte die Methoden back() und end() verwenden.

    Achja, das zweite Element ist denke ich voralloziert, so dass beim nächsten push_back kein Speicher mehr alloziert werden muss. Ist aber nur eine Vermutung.

    Gruß
    Don06



  • sqrt(-1) schrieb:

    Kommt beides vom gleichem lateinischem Begriff (corrumpere) und hat die gleiche Bedeutung.

    corrumpere = verderben, zerbrechen, entkräften, entstellen, bestechen



  • Oder auf gut deutsch: korrumpieren


Anmelden zum Antworten