Problem mit new



  • Hallo wenn ich z.b. eine 18 eingebe dann kommt bei strlen eine 22 raus was mach ich da falsch ?

    #include <iostream>
    using namespace std;
    
    int main()
    {
    
    char *var;
    int s;
    
    cout<<"Eingabe: ";   // 77
    cin>> s ;
    
    var = new char [ s ] ;
    
            for ( int i=0; i < s  ; i++)
            {
                var[i] = '\x90';
    
            }
    
    delete [] var;
    
    cout<<strlen(var);
    
    system("PAUSE");
    return 0;
    }
    //---------------------------------------------------------------------------
    


  • Der Aufruf von strlen nach dem Aufruf von delete für zu einem nicht definierten Ergebnis.

    mfg Martin


  • Mod

    strlen zählt die Zeichen bis zum ersten Nullzeichen. Da dein char-Array keine Nullzeichen enthält wird so lange weitergezählt bis im Arbeitsspeicher zufällig irgendwann mal eine Null steht.

    Allgemein muss man sich bei dynamischen Arrays selber merken wie groß sie sind (oder besser gleich eine Containerklasse benutzen). Es gibt im nachhinein keine Möglichkeit die Größe festzustellen (außer wenn man sich einen eigenen Operator new schreibt, dann könnte man dies als Feature einbauen).



  • mgaeckler schrieb:

    Der Aufruf von strlen nach dem Aufruf von delete für zu einem nicht definierten Ergebnis.

    mfg Martin

    Außerdem fehlt das abschließende NULL-Byte.

    mfg Martin



  • Wie kann ich denn dann den Speicherreservieren?



  • new_ schrieb:

    Wie kann ich denn dann den Speicherreservieren?

    Das hast Du schon richtig gemacht. Versuch's aber mal damit:

    #include <iostream> 
    using namespace std; 
    
    int main() 
    { 
    
    char *var; 
    int s; 
    
    cout<<"Eingabe: ";   // 77 
    cin>> s ; 
    
    var = new char [ s+1 ] ;    // <--- Platz für NULL-Byte nicht vergessen
    
            for ( int i=0; i < s  ; i++) 
            { 
                var[i] = '\x90'; 
    
            }
            var[s] = 0;   // <--- letztes NULL-Byte
    
    cout<<strlen(var); // <---- VOR dem delete
    
    delete [] var; 
    
    system("PAUSE"); 
    return 0; 
    } 
    //---------------------------------------------------------------------------
    

    mfg Martin


  • Mod

    new_ schrieb:

    Wie kann ich denn dann den Speicherreservieren?

    😕 Was hindert dich denn daran es so zu tun, wie du getan hast? Dein Fehler lag in der falschen Benutzung von strlen. Und was willst du überhaupt machen? Speicher reservieren muss man in C++ eigentlich nur äußerst selten selber machen.



  • SeppJ schrieb:

    Speicher reservieren muss man in C++ eigentlich nur äußerst selten selber machen.

    Das glaube ich nun gar nicht! 😡
    Ich mache davon weiterhin regen Gebrauch, um Speicherplatz sparsam anzufordern und gezielt wieder freizugeben, wenn ich ihn nicht mehr brauche. :p
    Das interessiert aber nur bei grösseren Speicheranforderungen, nicht unbedingt bei jedem Characterstring.



  • berniebutt schrieb:

    SeppJ schrieb:

    Speicher reservieren muss man in C++ eigentlich nur äußerst selten selber machen.

    Das glaube ich nun gar nicht! 😡
    Ich mache davon weiterhin regen Gebrauch, um Speicherplatz sparsam anzufordern und gezielt wieder freizugeben, wenn ich ihn nicht mehr brauche. :p
    Das interessiert aber nur bei grösseren Speicheranforderungen, nicht unbedingt bei jedem Characterstring.

    Pfft... Man wird nie mehr als 64kb Speicher benötigen!



  • Fellhuhn schrieb:

    Pfft... Man wird nie mehr als 64kb Speicher benötigen!

    64 kb ist auch schon eine Menge Holz, wenn man davon nur wenige Bytes tatsächlich braucht. Mein Programmierstil stammt noch aus der alten Zeit, wo mehr als z.B. 180 kb für alles ein Sonderjob für die Nachtstunden auf Grossrechnern war. Man hat sich da mit Dateien auf Magnetbändern und Chains - also der Abfolge mehrerer Programme - behelfen müssen. Und überhaupt, auch 64 kb sind schnell überschritten. :p


Anmelden zum Antworten