PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dynamische Speicherverwaltung



chrissi_w
28-11-2005, 07:57
Hallo, ich habe die folgende Struktur als doppelt verkettete Liste realisiert:

struct abits_achecks {
double **q;
double **r;
double *c;
struct abits_achecks *next;
struct abits_achecks *prev;
} ;

Nachdem ich Speicher mit malloc() allokiert habe, möchte ich es wieder freigeben. Dabei kommt es aber zum Segmentation Violation. Voran könnte das liegen?

ptr = first;
if (first == last) last = NULL;
first = first->next;
for (j = 0; j < a->abits; j++){
free (ptr->q[j]);
ptr->q[j]=NULL;
}
free(ptr->q);ptr->q=NULL;
free (ptr->c);ptr->c=NULL;
for (j = 0; j < a->achecks; j++) {
free(ptr->r[j]);
ptr->r[j]=NULL;
}
free(ptr->r);ptr->r=NULL;
free(first->prev);
first->prev = NULL;

Vielen Dank im Voraus :)

peschmae
28-11-2005, 09:43
So direkt was falsches sehe ich nicht - vorausgesetzt die Werte achecks und abits und so sind alle korrekt. Am besten nimmst du mal einen Debugger hervor und guckst wo genau das segfaultet.

MfG Peschmä

quinte17
28-11-2005, 10:52
ptr = first;
if (first == last) last = NULL;
first = first->next; // hier ist glaub ich der fehler...
for (j = 0; j < a->abits; j++){
free (ptr->q[j]);
ptr->q[j]=NULL;
}
free(ptr->q);ptr->q=NULL;
free (ptr->c);ptr->c=NULL;
for (j = 0; j < a->achecks; j++) {
free(ptr->r[j]);
ptr->r[j]=NULL;
}
free(ptr->r);ptr->r=NULL;
free(first->prev); // warum diese freigabe?
first->prev = NULL;


du hast den zeiger first und last. wenn die gleich sind, dann existiert logisch nur noch 1 speicherobjekt. somit setzt du last auf null...
den fehler den du nun begehst, ist dass du von first auf dein nächstes element gehst, was keinen sinn ergibt, da du ja nur noch 1 element hast. und dann versuchst du von diesem nicht definierten element speicher freizugeben...

greetz

karx11erx
28-11-2005, 12:14
quinte,

die Freigabe ist ok. Der ganze Code deutet für mich auf eine Ringliste hin. Irgendwann ist dann aber first->next undefiniert, und dann kommt es an der von Dir markierten Stelle zum Fehler.

Bei einer Liste mit nur einem Element kracht es sogar schon bei first->prev = NULL.

chrissi_w
01-12-2005, 15:01
Vielen Dank. Ich habe den Fehler gefunden. Es lag wirklich nicht an der Freigabe;)

Joghurt
03-12-2005, 17:00
Gewöhne dir an, Blöcke einzurücken. Ich war früher als Anfänger auch zu faul; mit dem Erfolg, das ich meine alten Codes nur noch mühsam entziffern kann.

peschmae
04-12-2005, 00:48
Ich behaupte mal das liegt nicht nur daran ;)

(War jetzt nicht als Beleidigung an deine Adresse gemeint - ich meine das Einrückungsproblem ist insofern keines als dass du das mit emacs oder indent problemlos beheben kannst)

MfG Peschmä

Joghurt
04-12-2005, 15:04
Natürlich. Aber wenn man gleich direkt einrückt, merkt man unter umständen, wenn man ein bisschen zuviel Schleifen miteinander verschachtelt, nämlich dann, wenn man bei 20 Zeichen Einrückung ist. ;)

Desweiteren war das eine wirre Mischung aus Pascal und Inlineassembler.

peschmae
04-12-2005, 16:45
Natürlich. Aber wenn man gleich direkt einrückt, merkt man unter umständen, wenn man ein bisschen zuviel Schleifen miteinander verschachtelt, nämlich dann, wenn man bei 20 Zeichen Einrückung ist. ;)

Das stimmt. Aber ab 5 Ebenen merkst du das auch ohne Einrückung. Es sei denn du denkst das sei normal ;)


Desweiteren war das eine wirre Mischung aus Pascal und Inlineassembler.

Wirr un Pascal kenne ich irgendwie :D

(Vielleicht gibts deshalb so viele Leute die Pascal nicht so mögen - das erinnert sie an ihre Jugendverbrechen ;))

MfG Peschmä