Schleifen - malloc & free
-
evil411 schrieb:
int i=0; //steht noch ganz oben if( (start) && (strlen(Array[i])<1) ) { //Wert groß? ist das absicht? Array[Wert] = (char *)malloc(STR_MAX+1); // Speicher wird reserviert memset(Array[wert],0,STR_MAX+1); // String wird mit ' ' vorbelegt for(k=wert;k>i;k--) { //k==wert, und Array[wert] wurde schon allokiert -> mem leak //hat Array[k-1] denn wirklich einen 'wert'? wurde es allokiert und ein string //samt terminierender 0 reingeschrieben? //man beachte, dass das +1 fehlt!! Array[k] =(char *)malloc(strlen(Array[k-1])); // Speicher wird reserviert memset(Array[k],0,strlen(Array[k-1])); // String wird mit ' ' vorbelegt //nicht genug speicher -> PENG strcpy(Array[k],Array[k-1]); // alle nach k folgende Felder werden ein Feld nach hinten kopiert } wert++; }else start= 0;
}
-
Shade Of Mine schrieb:
//Wert groß? ist das absicht? Array[Wert] = (char *)malloc(STR_MAX+1); // Speicher wird reserviert //*****Keine Absicht... sorry, habe es eigentlich auch klein***** memset(Array[wert],0,STR_MAX+1); // String wird mit ' ' vorbelegt for(k=wert;k>i;k--) { //k==wert, und Array[wert] wurde schon allokiert -> mem leak //*****was kann ich dagegen tun?***** //hat Array[k-1] denn wirklich einen 'wert'? wurde es allokiert und ein string //samt terminierender 0 reingeschrieben? //man beachte, dass das +1 fehlt!! //*****ja, hat einen wert, allokiert glaube ich noch nicht***** Array[k] =(char *)malloc(strlen(Array[k-1])); // Speicher wird reserviert memset(Array[k],0,strlen(Array[k-1])); // String wird mit ' ' vorbelegt //nicht genug speicher -> PENG //*****WARUM?***** strcpy(Array[k],Array[k-1]); // alle nach k folgende Felder werden ein Feld nach hinten kopiert } wert++; }else start= 0;
}
Was kann ich tun? Wie kann ichs ändern?
-
warum habe ich bei dem 2. malloc keinen speicher mehr und warum macht es peng? wie kann ich denn das ändern?
-
Wie schon gesagt, entweder machst du in der Schleife anstatt dem malloc() ein realloc() oder du machst vor dem malloc() noch ein free().
Es macht deswegen PENG, weil der Speicher, den du vor der Schleife bereits reservierst nicht freigegeben wird, d. h. bei jedem Durchlauf deiner Schleife bleiben Speicherleichen zurück und zwar genau in der Anzahl an Elementen deines Arrays. Kein Wunder, dass dein Speicher über kurz oder lang voll läuft.
-
und wie würde das genau aussehen? jedesmal wenn ich dort ein free reinbringe bekomme ich immer die fehlermeldung: debug assertion failed... Expression: _CrtIsValidHeapPointerPUserData
oder wie würde das denn mit realloc genau aussehen? das benötigt doch zwei parameter oder?
-
evil411_unlogged schrieb:
und wie würde das genau aussehen? jedesmal wenn ich dort ein free reinbringe bekomme ich immer die fehlermeldung: debug assertion failed... Expression: _CrtIsValidHeapPointerPUserData
Dann hat der Zeiger auf den du free() machst keinen ordentlich allokierten Speicher.
Dann hilft auch realloc() nix
-
diese meldung erscheint aber nicht immer... je nachdem wo ich mein free hinschreibe. Kann auch sein, dass ich ein falsches free hinschreibe. Wie müsste es denn wo stehen?
ich habe es jetzt hier zu stehen:if( (start) && (strlen(Array[i])<1) ) { Array[Wert] = (char *)malloc(STR_MAX+1); // Speicher wird reserviert memset(Array[wert],0,STR_MAX+1); // String wird mit ' ' vorbelegt for(k=wert;k>i;k--) { free(StrMemo[k-1]); Array[k] =(char *)malloc(strlen(Array[k-1])); // Speicher wird reserviert memset(Array[k],0,strlen(Array[k-1])); // String wird mit ' ' vorbelegt strcpy(Array[k],Array[k-1]); // alle nach k folgende Felder werden ein Feld nach hinten kopiert } wert++; }else ...
Stimmt denn das?
Da kommt nämlich die Meldung: blocktype is valid(pHead->nBlockUse)
-
...natürlich stegt anstatt StrMemo --> Array
-
kann mir nicht zufällig jemand ne Lösung für diese Schleife präsentieren wie er es machen würde? so langsam sehe ich vor lauter frees und mallocs gar nicht mehr durch. bekomme eine fehlermeldung nach der anderen. Am besten mit einem realloc IN der Schleife...
-
for(k=wert;k>i;k--) { Array[k] =(char *)realloc(Array[k], strlen(Array[k-1])+1); // Speicher wird reserviert memset(Array[k],0,strlen(Array[k-1])); // String wird mit ' ' vorbelegt --> ist eigentlich überflüssig strcpy(Array[k],Array[k-1]); // alle nach k folgende Felder werden ein Feld nach hinten kopiert }
Das ist alles.
Spätestens beim Programmende solltest du natürlich für alle dynamisch reservierten Elemente ein free() machen. Wo du den Speicher wieder freigeben musst, hängt davon ab, wo du Array deklariert hast. Wenn du Array als lokale Variable in einer Funktion z. B. deklarierst hast, dann musst du den reservierten Speicher am Ende der Funktion wieder freigeben!
for(k=0;k<anzelemente;++k) { free(Array[k]); }
anzelemente = Die Anzahl der Elemente des Arrays Array