Free(...)

Hallo Liebe Mitwissende,
zur Zeit stehe ich auf dem Schlauch.

Ich habe eine verschachtelte Struktur…
struct PIC
{
struct DATA
{
int wert1;
} * data;
};
Im Hauptprogram lege ich sie an, mit:
struct PIC picture;
struct PIC * pic;
pic = &picture;

Später allokiere ich Speicher - dynamisch mit:
pic->data = (struct PIC::smiley:ATA *) calloc(anzahl, sizeof(PIC::smiley:ATA));

Wenn ich nun direkt dahinter mit:
free(pic->data) die innere Struktur freigeben möchte, dann funktioniert das.

Jedoch schreibe ich etwas in die Struktur bevor ich sie wieder lösche:
pic->data[2].wert1 = 2; /* data ist ein array von meiner struktur */

Wenn ich nun den Speicher freigeben möchte mit:
free(pic->data) --> dann gibt es einen Speicherzugriffsfehler

Wie ist die Erklärung zu free zu verstehen in dem steht, dass free den zuletzt von malloc oder calloc reservierten Speicher freigibt?
Oder wo ist hier Haken?

Danke und viele Grüße
Denis

Hallo,

> struct PIC  
> {  
> struct DATA  
> {  
> int wert1;  
> } \* data;  
> };

d.h. wert1 ist ein Pointer…

Später allokiere ich Speicher - dynamisch mit:
pic->data = (struct PIC::smiley:ATA *) calloc(anzahl,
sizeof(PIC::smiley:ATA));

Wenn ich nun direkt dahinter mit:
free(pic->data) die innere Struktur freigeben möchte, dann
funktioniert das.

Jedoch schreibe ich etwas in die Struktur bevor ich sie wieder
lösche:
pic->data[2].wert1 = 2; /* data ist ein array von meiner
struktur */

… dem du hier ein Integer zuweist. Dem Pointer, nicht dem Ziel des Pointers!

Wenn ich nun den Speicher freigeben möchte mit:
free(pic->data) --> dann gibt es einen
Speicherzugriffsfehler

Weil du probierst, den Pointer auf 2 freizugeben.

Wie ist die Erklärung zu free zu verstehen in dem steht, dass
free den zuletzt von malloc oder calloc reservierten Speicher
freigibt?

Kenn ich nicht. Bei mir steht in der Manpage zu free:

 free() frees the memory space pointed to by ptr, which must have been
 returned by a previous call to malloc(), calloc() or realloc(). Other-
 wise, or if free(ptr) has already been called before, undefined
 behaviour occurs. If ptr is NULL, no operation is performed.

D.h. free() gibt dem Speicher frei, zu dem du einen Pointer übergeben hast, nicht den zuletzt von calloc allokierten Speicher.

Grüße,
Moritz

Hallo,

Hallo,

struct PIC
{
struct DATA
{
int wert1;
} * data;
};

d.h. wert1 ist ein Pointer…

hilf mir hier bitte das zu verstehen…
Wieso ist wert1 ein Pointer? Ist nicht data ein Pointer, der auf eine Struktur zeigt, die einen Integer hat?

Nun (zuhause) habe ich das nachvollzogen und folgendermaßen hinbekommen:

 int anzahl=5;
 struct DATA
 { int wert1;
 };
 struct PIC
 {
 struct DATA \* data;
 } pic;
/\* allokation \*/
 pic.data = calloc(anzahl,sizeof(struct DATA));
 int i=0;
/\* werte speichern \*/
 for (i = 0; i 
Leider verstehe aber noch nicht ganz wo der Unterschied zum ursprüglichen Code ist.



> Grüße,  
> Moritz

Danke nochmal.
Denis

Hallo,

hilf mir hier bitte das zu verstehen…
Wieso ist wert1 ein Pointer? Ist nicht data ein Pointer, der
auf eine Struktur zeigt, die einen Integer hat?

Du hast natürlich recht, ich habe nicht genau genug hingesehen :wink:

Grüße,
Moritz