Speicherverwaltung



  • mit new und delete bzw. bei arrays new[] und delete[] http://www.fun-soft.de/Download/EBook/cplusplus/kap08.html#70357



  • Original erstellt von tobis79211:
    **Wie allokiere ich denn Speicher in C++?
    **

    zum beispiel mit int arr[5];
    was willste genau? ein array, das die größe ändern kann? wenn eins ausreicht, das automatisch nach bedarf wachsen kann, dann wäre std::vector geeignet.

    vector<int> v;
    for(int i=0;i<5;++i)
      v.push_back(i*i);//v wächst jeweils um eins
    for(int i=0;i<5;++i)
      cout<<v[i]<<endl;
    //gibt 5 quadtratzahlen aus.
    


  • ok, aber was mach ich, wenn ich ein Array "feld" mit 5 Schlüsseln habe und es erweitern muss auf 10?

    feld  = new int[5];
    feld2 = new int[10];
    for(int i=0;i<5;i++) feld2[i] = feld[i];
    delete feld;
    feld = new int[10];
    feld = feld2;
    delete feld2;
    

    ????
    Kann das sein, oder geht das nicht schlauer??



  • jedes new[] verlangt ein delete[]
    lies mal in deinem C++ Buch nach.

    und dann nimm einen vector:

    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(4);
    vec.push_back(5);

    jetzt erweitern wir:

    vec.push_back(3);
    vec.push_back(3);
    vec.push_back(3);

    und schon haben wir 8 elemente 🙂



  • Original erstellt von tobis79211:
    **ok, aber was mach ich, wenn ich ein Array "feld" mit 5 Schlüsseln habe und es erweitern muss auf 10?

    feld  = new int[5];
    feld2 = new int[10];
    for(int i=0;i<5;i++) feld2[i] = feld[i];
    delete feld;
    feld = new int[10];
    feld = feld2;
    delete feld2;
    

    ????
    Kann das sein, oder geht das nicht schlauer??**

    fast perfekt.

    feld  = new int[5];
    //feld irgendwie vollmachen
    
    //und erweitern mit
    feld2 = new int[10];
    for(int i=0;i<5;i++) feld2[i] = feld[i];
    delete[] feld;
    feld = feld2;
    
    //und zum schluß am besten noch löschen
    delete[] feld;
    

    oder vector nehmen, das nimmt die viel ab.

    vecor<int> feld(5);
    //feld irgendwie vollmachen
    
    //und erweitern mit
    feld.resize(10);//macht auch nur deinen code von oben innerhalb von resize
    
    //und zum schluß am besten noch löschen
    //macht der destruktor von vector dann alleine
    


  • ok, die beiden Lösungen reichen mir auf jeden Fall!
    Dann vielen Dank Euch!
    Gruss, Tobias

    PS: Dabei find ich C schon "netter"! (-> realloc)



  • Hi HALT!!!
    Das klappt bei mir aber überhaupt nicht!

    Bei mir sieht der Code so aus:
    Wobei Str eine Klasse von mir ist...

    // muss mehr allokiert werden
      if( (this->n+1)%ALLOC==0 ) { // mehr allokieren
        int i;
        Str* nw = new Str[this->n+ALLOC];
        for(i=0;i<this->n;i++) nw[i] = Str[i];
        delete[] this->Str;
        this->Str = new Str[this->n+ALLOC];
        //for(i=0;i<this->n;i++) this->Str[i] = nw[i];
        this->Str = nw;
        delete[] nw;
      }
      // DATEN EINFÜGEN  
      Tue was...
    

    Zum Test hab ich ALLOC mal auf 1 gestellt... allerdings bekomme ich dann beim einfügen eines zweiten Elementes einen Speicherfehler...
    Also scheint das wohl nicht immer ordentlich erweitert zu werden!
    Hilfe???

    [ Dieser Beitrag wurde am 14.05.2003 um 23:02 Uhr von tobis79211 editiert. ]



  • hi, bitte helft mir damit!
    Ich bekomm echt dauernd noch Speicher-Errors, sobald ich die "alte" Feld-Grösse überschreite!
    Danke!! Tobias



  • warum machst dus nicht so wie wirs vorgeschlagen haben?? (also mit container)

    erklär mir mal folgende zeilen:
    this->Str = nw;
    delete[] nw;
    und
    if( (this->n+1)%ALLOC==0 )

    schau dir mal volkards code an, und vergleich ihn mit deinem...



  • Hi Shadow,
    ja, ok, das sieht nicht so glücklich aus, war ein Test der nicht ging...
    Folgendes ging nämlich auch nicht:

    if( (this->n)%ALLOC==0 ) { // mehr allokieren
        int i;
        Str* nw = new Str[this->n+ALLOC];
        for(i=0;i<this->n;i++) nw[i] = Str[i];
        delete[] this->Str;
        this->Str = new Str[this->n+ALLOC];
        for(i=0;i<this->n;i++) this->Str[i] = nw[i];
        //this->Str = nw;
        delete[] nw;
    }
    

    Hierbei ist der einzige Unterscheid (glaub ich!) zu Volkard's Code, dass ich

    for(i=0;i<this->n;i++) this->Str[i] = nw[i];
    

    statt

    feld = feld2;
    

    mache.
    Aber das müsste doch trotzdem klappen, oder? (Tut's halt nicht...)

    Ja, warum ich es so machen will, ist vermutlich reine Dickköpfigkeit... es muss ja so gehen, oder? (Dann will ich es halt auch hinbekommen!)
    Wäre aber trotzdem sehr nett, wenn Du/Ihr mir hilfst!
    Gruss, Tobias

    [ Dieser Beitrag wurde am 14.05.2003 um 23:01 Uhr von tobis79211 editiert. ]

    [ Dieser Beitrag wurde am 14.05.2003 um 23:15 Uhr von tobis79211 editiert. ]



  • erklär mir bitte
    if( (this->n)%ALLOC==0 )
    ich verstehe diese zeile nicht.

    und dann erkläre mir bitte was hier passiert:
    char* s=new char[100];
    strcpy(s,"Hallo");
    char* p=s;
    delete [] s;
    cout<<p;

    Was wird ausgegeben?
    Was passiert bei der Zeile char* p=s
    p Zeigt worauf?

    for(i=0;i<this->n;i++) this->Str[i] = nw[i];
    die größe ist aber nicht n sondern n+ALLOC



  • wieso verwendest du übrigens so oft den this zeiger? befindest du dich in einer funktionsimplementierung einer klasse, kannst du ohne den this zeiger zugreifen, einfach so...
    des weiteren: hast du eine Klasse namens 'Str' und ein objekt, das 'Str' heist? wäre grob fahrlässig, und der compiler müsste eigentlich meckern 😉



  • Hi Shadow,

    naja also das if() ist ein Test dafür, ob die Grösse des Arrays über eine gewisse Grenze wächst.
    Als Beispiel: Wenn ALLOC 50 ist, dann wird alle 50 Schritte Speicher für weitere 50 allokiert!
    ...Dadurch kann man halt den Speicherverbrauch "regeln"

    Das Dein Beispiel nicht funktioniert ist mir völlig klar, schliesslich zeigt der Pointer p ja auf s!
    Aber ich mach das doch garnicht (denke ich!), da ich neuen Speicher mit new allokiere und dann die Elemente einzeln da reinschiebe...
    Zumindest dachte ich das so!
    Oder hab ich da eine Lücke und ich schiebe da auch wieder nur Referenzen (Pointer) rum?

    Wenn das so wäre, dann wüsste ich immerhin wo der Fehler ist!
    Gruss, Tobias



  • Hi,
    also ich hab mir das echt zu Gewissen geführt...
    Und in meinem Array Str* sind vom DatenTyp Str ja Daten gespeichert und keine Pointer! Das bedeutet, ich müsse die ja einfach aus ein Feld in ein anderes kopieren können, wenn ich dieses neue Feld allokiert habe, oder nicht?

    Als Beispiel:
    Dein Beispiel mit den char* funktioniert doch auch, wenn du p und s mit malloc allokierst und dann mit ner for-Schleife vollschreibst.
    Zumindest hab ich keinen Grund dafür, dass das nicht geht!
    Das hat zumindest bei mir einwandfrei funktioniert:

    char* s=new char[100];
    strcpy(s,"Hallo");
    char* p = (char*) malloc( strlen(s)+1 );
    for(int i=0;i<(int)strlen(s);i++) p[i] = s[i];
    p[strlen(s)]='\0';
    delete [] s;
    MessageBox(p,p,MB_OK);
    

    Aber ist das nicht rein prinzipiell das gleiche, was ich auch mache???
    Vielen Dank auch für weitere Hilfe gleich im voraus (und bitte nicht die Geduld verlieren!)
    Gruss, Tobias



  • nimm dohc endlcih nen vector!


Anmelden zum Antworten