Initialisierung?



  • Vielleicht liegt es an der Uhrzeit, aber bisher dachte ich dass der Speicher eines Objektes bei der Instanzierung mit dem new-Operator nicht mit null initialisiert wird.

    Jedoch sieht es im MSVC debugger so aus als ob das generell alles mit null initialisiert ist?



  • theoretisch isses so:
    new selbst macht sowas nicht, sondern new besorgt speicher, der alles mögliche enthalten kann, und ruft dann deinen konstruktor auf. wenn dein konstruktor nix reinschreibt, hast du zu erwarten, daß irgendwas drin steht.
    das betriebssystem liefert aber nur genullten speicher, so daß new dir automatisch auch genullten speicher liefert, solange es frischer speicher ist. ist es speicher, der schonmal von delete freigegeben wurde, können auch alte c++-daten drin stehen.
    aber MSVC ist bekannt dafür, daß er immer mal wieder lustige sachen macht, wie doppelt-große iteratoren und so, vielleicht meinte microsoft wiedermal, immer-genullter speicher sei besser und heuer schreibt der operator new den speicher auch noch mal mit 0 voll. und bald bestätigen ernsthafte messungen, daß C++/CLI schneller als natives C++ ist. wir werden es erleben.

    debugger??? in der debug-version ist das ganz ok. erwarten würde, daß new leifert: ich vorher und nachher ein kleines bitmuster umd grenzen zu erkennen, innendrin ein anderes, um uninitialisierten speicher zu erkennen, CDCDCDCD vielleicht. Automagische-Konstruktoren schreiben nullen rein. Automagische Destruktoren schreiben CCCCCCCC rein und delete schreibt DDDDDDDD rein oder sowas. Uih, könnte man damit geil Speicherfehler finden.



  • Hmm... da komme ich mir jetzt all die vielen memsets für die struct arrays in meinen Konstruktoren ganz schön überflüssig vor.



  • Kandidat schrieb:

    Hmm... da komme ich mir jetzt all die vielen memsets für die struct arrays in meinen Konstruktoren ganz schön überflüssig vor.

    Wenn sie nur zum Debuggen da waren, kann das schon sein.
    Wenn sie auch für die Nutzdaten sinnvoll sind, mußt Du sie auch machen, denn Du hast keine Versprechen, wie der Speicher ohne dein Zutun im Release-Modus sein wird. Und keins, wie er sein wird, wenn das nächste Update des Compilers kommt.



  • Bei primitiven Datentypen gibt es noch eine Besonderheit (und nicht-primitive wirst Du ja wohl nicht mit memset übernageln, gell? :D), nämlich die Value-Initialisierung. Findet diese statt, wird der Speicher auch automatisch auf "eine in den Zieltyp konvertierte 0" gesetzt.

    Value-Initialisierung erreicht man durch leere Klammern nach dem Typnamen bei new.

    int* one1 = new int; // keine Initialisierung
    int* one2 = new int(); // Value-Initialisierung
    int* many1 = new int[10]; // keine Initialisierung
    int* many2 = new int[10] (); // Value-Initialisierung
    

Log in to reply