Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Free memory

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
07.05.2005, 18:39 Uhr
~Florian
Gast


Hallo,

bin langsam am verzweifeln. Ich habe ein dynamisch angelegtes Zeiger-Array bei welchem ich Speicher dynamisch allokiere. Soweit so gut. Leider gelingt es mir anschließend nicht mit free() den allokierten Speicher wieder freizugeben . Ich erhalte immer einen ungültigen fread fehler. Was mache ich falsch?



C++:
...

int main()
{
   int *arr[100];

   test(arr);

   // crash
   free(arr);

   return 0;
}

void test(int **v)
{
    v[1] = malloc(10 * sizeof(int));
    strcpy(v[1], "probe");
}



MfG
flo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.05.2005, 18:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


klar, du alloziierst nur v[1], löscht aber "v[0]" also einen uninitialisierten pointer, der zeigt irgendwo ins nirvana, das erzeugt dann den crash. (der erste index eines arrays ist 0, nicht vb-style 1)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.05.2005, 19:08 Uhr
~Florian
Gast



Zitat von FloSoft:
klar, du alloziierst nur v[1], löscht aber "v[0]" also einen uninitialisierten pointer, der zeigt irgendwo ins nirvana, das erzeugt dann den crash. (der erste index eines arrays ist 0, nicht vb-style 1)


Hallo FloSoft,

vielen Dank für deine Antwort! Ich alloziiere im eigentlichen Programm alle 100 vektoren und gebe diese in main() dann auch problemlos aus. Das 0 der erste index ist, weiß ich. Das ganze läuft im Prinzip so unter test():


C++:
    for(i=0; i<100; i++)
    {    
        fread(&line, sizeof(line), 1, input);

        v[i] = (int *) malloc(LINE_LENGTH * sizeof(int));

        v[i] = (int *) realloc(int[i], strlen(line) * sizeof(int));

        strcpy(v[i], line);
        }




Wie gesagt. In main() würde ich nun gerne den gesamten Zeiger-Vektor lösen. Muss dazu aber sagen das ich soetwas mit einem Zreiger-Vektor noch nie ausprobiert habe. Vielleicht ist mein Ansatz falsch?

Gruß
flo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.05.2005, 19:35 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


als erstes würde ich halt sagen warum du v[i] erstmal mit einer default-length allocst und danach reallocst? nimm halt gleich malloc mit der "richtigen größe"? ansonsten:


C++:
realloc(int[i], strlen(line) * sizeof(int));


kann sein das er das nicht ankreidet, aber da muss ein v hin

Ansonsten müsstest du so aufräumen:


C++:
for(i = 0; i < 100; i++)
  free(v[i]);



da du sonst einen zeiger auf ein festes memorystück freigeben willst.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.05.2005, 19:49 Uhr
~Florian
Gast



Zitat:
als erstes würde ich halt sagen warum du v[i] erstmal mit einer default-length allocst und danach reallocst? nimm halt gleich malloc mit der "richtigen größe"?


Das realloc() hatte ich nur mal als test im code drinnen. Habe es nun vollständig entfernt, obwohl es ja nicht gestört hat.


Zitat:
kann sein das er das nicht ankreidet, aber da muss ein v hin


Jupp auch da. Ist beim kopieren hierher wohl verloren gegangen...


C++:
for(i = 0; i < 100; i++)
  free(v[i]);



Das habe ich schon versucht, leider erfolglos. Weder in main() noch in der Unterfunktion scheint das ganze zu funktionieren. Folgende Meldung erscheint nach dem kompilieren unter VS 2003: Debug Error! DAMAGE: after Normal block (#51) at 0x00322D88.

Scheint ein ärgerliches Zeigerwirrwarr vorzuliegen.

Gruß
flo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.05.2005, 20:46 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ah du nutzt visual studio, ok dann musst du den speicher in der funktion wieder löschen in der du ihn allocst (also z.b main) sonst gibts den fehler.

ansonsten würde ich mal probieren was passiert wenn du die uninitialisierten erstmal mit NULL initialisierst.
--
class God : public ChuckNorris { };

Dieser Post wurde am 07.05.2005 um 20:46 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.05.2005, 21:00 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

ah du nutzt visual studio, ok dann musst du den speicher in der funktion wieder löschen in der du ihn allocst (also z.b main) sonst gibts den fehler.


äh das ist mir aber neu... ist zwar schlechter stil wenn man den "Aufrufer" zum Speichermanagement verdonnert aber funktionier tuts trotzdem auch mit VC...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.05.2005, 21:20 Uhr
~Florian
Gast



C++:
ah du nutzt visual studio, ok dann musst du den speicher in der funktion wieder löschen in der du ihn allocst (also z.b main) sonst gibts den fehler.


Das ganze sollte eigentlich später auch unter dem gcc funktionieren. Zumindest werde ich es dann dort auch testen, da in den unis nur solaris und gcc installiert ist . Das unter VS der Speicher in der gleichen Funktion wieder freigegeben werden muss wo er auch allokiert wird wusste ich bisher nicht - danke für die info. Aber ich hatte es schon probiert in test() mit free(v), ohne Erfolg .


C++:
ansonsten würde ich mal probieren was passiert wenn du die uninitialisierten erstmal mit NULL initialisierst.


Ähm, wie stelle ich das bei einem Zeiger-Vektor am besten an? Ich kann bei obigen Beispiel free(v[0]); anwenden wenn ich zuvor v[0] = NULL; schreibe. Aber ist das sinnvoll? Beim NULL Zeiger macht free ja nichts.

Gruß
flo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.05.2005, 22:05 Uhr
~Florian
Gast


Habe nun das ganze unter Linux und dem GCC Compiler getestet. Funktioniert problemlos mit free(v); .

Unter Windows und VC 2003 gibt es wie gesagt den Crash. Warum das so ist wüsste ich allzu gerne, obwohl es ja nur unter GCC funktionieren muss . Trotzdem wäre ich für weitere Tipps sehr dankbar!

BTW: Weiß jemand warum der GCC immer ein Warning wegen inkompatiblen Zeiger Typen bei qsort() schmeißt trotz ANSI 99 gerechtem Code?

Gruß
flo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.05.2005, 22:59 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ~Florian:

Habe nun das ganze unter Linux und dem GCC Compiler getestet. Funktioniert problemlos mit free(v); .


hätte mich auch gewundert wenn nicht


Zitat von ~Florian:

Unter Windows und VC 2003 gibt es wie gesagt den Crash. Warum das so ist wüsste ich allzu gerne, obwohl es ja nur unter GCC funktionieren muss . Trotzdem wäre ich für weitere Tipps sehr dankbar!


Tja Windows


Zitat:

BTW: Weiß jemand warum der GCC immer ein Warning wegen inkompatiblen Zeiger Typen bei qsort() schmeißt trotz ANSI 99 gerechtem Code?



zeig den code, evtl nen c-style cast benutzt?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: