Problem mit speicher freigeben (free(...))



  • Hallo, ich habe eine Funktion geschrieben, die soll aus einer binären Datei etwas auslesen, in einen temp char array schreiben.

    Da ich nicht weiß wie groß temp werden soll hab ich es dynamisch gemacht.

    Dann mach ich ein malloc und will dann nachher den Speicher wieder freigeben, aber wenn ich ein free(temp) mach kommt folgender Fehler:

    Debug Error!
    HEAP CORRUPTION DETECTED: after Normal block (#60)
    CRT detected that the application wrote to memory after end of heap buffer.

    (ich verwende Visual Studio C++ Express)

    Hier die Funktion:

    header readPpm(char *filename)
    {
      FILE * pFile;
      long lSize;
      char * buffer;
      size_t result;
      header ppm_header;
      int count = 0;
      int part_chk=0;
      int part_count=0;
      char *temp;
    
      pFile = fopen ( filename , "rb" );
    
      if (pFile==NULL) 
      {
        //FILE NICHT ÖFFNEN
      }
    
      // obtain file size:
      fseek (pFile , 0 , SEEK_END);
      lSize = ftell (pFile);
      rewind (pFile);
    
      // allocate memory to contain the whole file:
      buffer = (char*) malloc (sizeof(char)*lSize);
      if (buffer == NULL) 
      {
        //NO MEMORY
      }
    
      // copy the file into the buffer:
      fread (buffer,1,lSize,pFile);
      fclose (pFile); 
    
      for(count = 0; count<=lSize;count++)
      {
        if((buffer[count]=='\n'))
        {
          if(part_chk==0)
          {
            memcpy(ppm_header.id,buffer,count);
            ppm_header.id[count]='\0';
            part_count = count;
          }
    
          if(part_chk==1)
          {
            temp = (char*)malloc(sizeof(char)*(count-part_count)); //SPEICHER WIRD
            memcpy(temp, buffer + part_count+1,count);             //ANGEFORDERT
            temp[count-part_count-1]='\0';
            part_count = count;
    
            if(zahlenchk(temp))
            {
              ppm_header.width = atoi(temp);
              free(temp);                         //HIER KOMMT DER FEHLER
            }                                     //ABER WARUM???
            else
            {
              //error
              free(temp);
            }
          }
    

    Danke für eure Hilfe!



  • Schau mal, wie viele Bytes Du mit memcpy unter dem betreffenden malloc-Aufruf kopierst. Sicher, dass das passt?



  • auch wenn es so wäre, müsste das free trotzdem gehen bzw. warum nicht?



  • Wenn du über den allokierten Speicher schreibst, erzeugst du undefiniertes Verhalten. Es ist nicht nur undefiniert, weil man nicht weiß was, sondern auch wann, oder ob überhaupt ein Fehler auftritt. Der Fehler taucht erst beim free() auf, da erst dann bemerkt wird, dass du den Heap zerschossen hast.

    Gruß
    Don06



  • hey danke für die info.

    werd ich mal ausprobieren, wenn ichs net hinbekomm meld ich mich wieder 🙂


Anmelden zum Antworten