merkwürdiges verhalten von delete []



  • Ja stimmt, Du hast recht, (ctor wird beim aufruf des copy-ctor's gar nicht aufgerufen soweit ich weiß)

    ich flush'e den speicherbereich ainfach auf zero nach der allokation,..
    dann dürften auch keine weiteren probleme auftreten,..

    Ich danke für eure gedult und hilfe 🙂



  • zeusosc schrieb:

    ich flush'e den speicherbereich ainfach auf zero nach der allokation,..
    dann dürften auch keine weiteren probleme auftreten,..

    Ich danke für eure gedult und hilfe 🙂

    Warum den das?! Lass einfach das delete[] da weg. Es heisst ja nicht umsonst copyKONSTRUKTOR, weil du da ja etwas erzeugen(konstruieren) willst und nicht etwas zerstören.

    @Tachyon in der Zukunft:
    Genau das habe ich auch das Gefühl. 😉



  • zeusosc schrieb:

    Ja stimmt, Du hast recht, (ctor wird beim aufruf des copy-ctor's gar nicht aufgerufen soweit ich weiß)

    ich flush'e den speicherbereich ainfach auf zero nach der allokation,..
    dann dürften auch keine weiteren probleme auftreten,..

    Ich danke für eure gedult und hilfe 🙂

    Irgendwie habe ich das dumpfe Gefühl, dass Du immer noch auf dem Holzweg bist...



  • Wieso bin ich aufm holzweg??

    Ich habe schon mehrfach erlebt das bei einer durch new erzeugten Array die elemente nicht leer sind. Das wollte ich umgehen. Da delete[] mir ärger macht lasse ich dieses weg, allokiere den speicher und setze deren Inhalt auf null. Was ist an diesem verfahren falsch?

    gruß



  • zeusosc schrieb:

    Wieso bin ich aufm holzweg??

    Ich habe schon mehrfach erlebt das bei einer durch new erzeugten Array die elemente nicht leer sind. Das wollte ich umgehen. Da delete[] mir ärger macht lasse ich dieses weg, allokiere den speicher und setze deren Inhalt auf null. Was ist an diesem verfahren falsch?

    gruß

    Was heisst "nicht leer"? Nicht mit 0 initialisiert?



  • Ja.



  • zeusosc schrieb:

    Wieso bin ich aufm holzweg??

    Siehe unten 😃

    Ich habe schon mehrfach erlebt das bei einer durch new erzeugten Array die elemente nicht leer sind.

    Elemente eines Arrays können nie leer sein. Sie können höchstens einen Wert von 0 haben, aber das ist genauso ein Wert wie 1, 2, 3.5, ... Frisch allokierte POD-Arrays haben - wenn nicht anders angegeben, dazu unten mehr - keine definierten Vorgabewerte, sondern enthalten "Müll".

    BTW, kann auch Dein Zeiger, wenn Du ihn nicht initialisierst (sei es mit 0 oder dem Ergebnis von new T[]) Müll enthalten. Das gibt Dir aber noch lange nicht das Recht, das, worauf der Müll zufällig zeigt, zu löschen.

    Das wollte ich umgehen.

    Da gibt es eigentlich nichts zu umgehen. Es gibt höchstens die Notwendigkeit, dass das Array nach der Allokation mit bestimmten Werten vorbelegt wird, was man einfach erreichen muss. Auch dazu siehe unten.

    Da delete[] mir ärger macht

    Kein Wunder, man kann nichts löschen, was man vorher nicht erzeugt hat.

    lasse ich dieses weg,

    Guuute Entscheidung 😃

    allokiere den speicher und setze deren Inhalt auf null. Was ist an diesem verfahren falsch?

    Ab hier ist an dem Verfahren nichts mehr falsch.

    Und nun noch zu dem Tip: Es gibt in C++ die sogenannte Default-Initialisierung, die bei PODs auf Value-Initialisierung hinausläuft auch bei Arrays. Value-Initialisierung bedeutet, dass mit einer in den Zieltyp konvertierten 0 initialisiert wird.

    Das Beispiel zum Tip:

    twoDimArr(const twoDimArr& p)
    { 
        /* An diesem Punkt sind ALLE Member uninitialisiert. Sie enthalten Müll. Wenn der Müll nach sinnvollen Daten aussieht, ist das Zufall. */
        ...
    
        pArr = new float[Rows*Cols] (); // das leere Klammernpaar bewirkt Value-Initialisierung
    
        /* durch die Value-Initialisierung enthält pArr lauter Nullen */
    
        /* ist aber eigentlich garnicht nötig, da du hier die Werte sowieso alle direkt überschreibst: */
        for(int i=0; i<((Rows)* (Cols)); i++)
            pArr[i]=p.pArr[i];
    }
    

  • Mod

    LordJaxom schrieb:

    /* durch die Value-Initialisierung enthält pArr lauter Nullen */

    pArr tut das nicht. Für das Array, in das pArr zeigt, trifft die Aussage dagegen zu. Mir ist klar, dass du das weißt, aber es könnte missverstanden werden.



  • Ich danke euch. Das mit der standartval-init wusste ich net.

    Das mit "leer" war auch nur als saloppe metapher gemeint. 😉

    Seid gegrüüßt und habt dank.



  • camper schrieb:

    pArr tut das nicht. Für das Array, in das pArr zeigt, trifft die Aussage dagegen zu. Mir ist klar, dass du das weißt, aber es könnte missverstanden werden.

    Du hast natürlich recht, und ich muss dringend an der Präzision meiner Formulierungen arbeiten 😉


Anmelden zum Antworten