free() führt zu Exception

OP #3442111
Lesenswert?

Hallo,

neues Problem neuer Beitrag...

Um eine Datei in einen String einzulesen alloziere ich Speicher mit 
malloc(). Wenn ich den Speicher mit free() am ende des Programms wieder 
freigeben möchte, springt das Programm (beim debuggen) in folgenden 
Handler:
1
/***
2
*void _unlock_fhandle(int fh) - unlock file handle
3
*
4
*Purpose:
5
*       Release the lock associated with passed file handle.
6
*
7
*Entry:
8
*       int fh  - CRT file handle
9
*
10
*Exit:
11
*
12
*Exceptions:
13
*
14
*******************************************************************************/
15

16
void __cdecl _unlock_fhandle (
17
        int fh
18
        )
19
{
20
        LeaveCriticalSection( &(_pioinfo(fh)->lock) );
21
}

Der entscheidende Code sieht so aus (alles dazwischen habe ich im 
Programm auskommentiert):
1
  input = fopen(INPUTFILE, "r");
2
  datasize = ftell(input);
3
  plaindata = (char *)malloc(datasize);
4
  fscanf(input, "%s", plaindata);
5
  fclose(input);
6

7
        free(plaindata);
Gast #3442154
Lesenswert?

Robert B. schrieb:
> Kannst du das genauer beschreiben? Also klar, wenn ich den Speicher
> überschreibe gibt's Probleme. Aber in meinem Programm überschreibe ich
> doch nichts, oder?

doch denke schon, denn mit %s liest man eine String ein und am ende wird 
ein 0 Byte eingefügt dafür hast du aber kein Platz mehr.
OP #3442159
Lesenswert?

Ja, du hast recht! So läuft es jetzt, wie es soll.
1
  input = fopen(INPUTFILE, "r");
2
  fseek(input, 0, SEEK_END);
3
  datasize = ftell(input);
4
  fseek(input, 0, SEEK_SET);
5
  plaindata = (char *)malloc(datasize+1);
6
  fscanf(input, "%s", plaindata);
7
  fclose(input);
8

9
  free(plaindata);
OP #3442197
Lesenswert?

1
  if(NULL == (input = fopen(INPUTFILE, "r")))
2
    input = make_file();
3

4
  fseek(input, 0, SEEK_END);
5
  datasize = ftell(input);
6
  fseek(input, 0, SEEK_SET);
7
  plaindata = (char *)malloc(datasize+1);
8
  fread(plaindata, sizeof(char), datasize, input);
9
  plaindata[datasize] = '\0';
10
  fclose(input);
11

12
  free(plaindata);
Gast #3442235
Lesenswert?

Rufus Τ. Firefly schrieb:
> Wird calloc anstelle von malloc verwendet, ist der Speicher bereits
> Null-Initialisiert, und man kann das nachträgliche Setzen der '\0' nicht
> versehentlich vergessen:
>   plaindata = (char *) calloc(datasize + 1, sizeof (char));
>   fread(plaindata, sizeof (char), datasize, input);
>
>   // kann wegfallen
>   plaindata[datasize] = '\0';

finde ich aber hierfür nicht sinnvoll. Es nur Resourcenverschwendung, da 
der Speicher danach eh mit Inhalt gefüllt wird.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren