2016-10-17 1 views
0

Ich habe ein Problem, wo, wenn ich eine Funktion, die ich schrieb, um eine Struktur freizugeben mein Programm auf der ersten freien Anweisung beendet.Funktion zum Freigeben einer Struktur in C

Hier ist die Funktion:

void deleteJobNode(struct jobNode *node) { 
    free(node->burstTime); 
    free(node->jobIndex); 
    free(node->next); 
    free(node->priority); 
    free(node->remainingTime); 
    free(node); 
} 

Hier ist die Definition der Struktur und die Funktion benutzten Speicher zum struct zuzuteilen.

struct jobNode { 
    struct jobNode *next; 
    int jobIndex; 
    int burstTime; 
    int remainingTime; 
    int priority; 
}; 

struct jobNode *createJobNode(int newJobIndex, int newBurstTime, int newRemainingTime, int newPriority) { 
    struct jobNode *newNode = (struct jobNode *)malloc(sizeof(struct jobNode)); 
    newNode->jobIndex = newJobIndex; 
    newNode->burstTime = newBurstTime; 
    newNode->remainingTime = newRemainingTime; 
    newNode->priority = newPriority; 

    if(newNode == NULL) 
     printf("Node Creation Error"); 

    return newNode; 
} 

Ich habe die freie Funktion wie vorgeschlagen bearbeitet:

void deleteJobNode(struct jobNode *node) { 
    free(node); 
} 

Jedoch habe ich diesen Fehler zur Laufzeit erhalten:

*** Error in `/home/jack7521/workspace/req1b/Debug/req1b': double free or corruption (fasttop): 0x00000000010c2090 *** 
+0

Bearbeitete den Code, um wie vorgeschlagen, ich bekomme immer noch einen Fehler –

+0

Der Fehler ist wahrscheinlich an anderer Stelle in Ihrem Code. Bitte aktualisieren Sie Ihre Frage mit einem [minimalen, vollständigen, überprüfbaren Beispiel] (http://stackoverflow.com/help/mcve). – dbush

+0

Sie sollten 'malloc' s Rückgabewert direkt überprüfen, nachdem Sie es aufgerufen haben. Hier versuchen Sie, auf die Strukturelemente zuzugreifen, um sie zu initialisieren, bevor Sie überprüfen, ob ein Nullzeiger zurückgegeben wurde. – jule

Antwort

2

Sie tun ein Aufruf malloc; also warum denkst du, du brauchst mehrere Anrufe an frei?!

Thing ist: Sie müssen nur kostenlos diese Struktur einmal - die endgültige free(node) macht den Job!

Denken Sie daran, was diese Methoden für Sie tun: malloc markiert einen zusammenhängenden Speicherbereich für den Einsatz; und frei gibt Bereich. Es hat keinen Sinn, die Mitglieder Ihrer Struktur überhaupt freizugeben. Denn sie sind innerhalb dieser Bereich sowieso.

Oder aus einem anderen Blickwinkel: malloc gibt Ihnen eine Menge Bytes. Die Tatsache, dass Sie später diese Bytes mit diesem "struct" "overlay" verwenden, ist überhaupt nicht wichtig!

4

Sie benötigen einen free für jeden malloc. Sie müssen nicht nicht dynamische Felder eines struct freigeben, sie sind bereits Teil des struct selbst, so dass der Zeiger auf das gesamte struct frei ist.

Sie brauchen nur:

free(node); 
+0

Sie müssen nicht 'free (bufptr-> next)' aufrufen, da es in einem anderen Aufruf von 'createJobNode' erzeugt werden soll. Es wird also zweimal freigegeben, wenn Sie es für diesen Knoten und den nächsten aufrufen. Wahrscheinlich ist das Problem tatsächlich hier. –

0

Sie nur free mit dem Zeiger auf die Struktur-Instanz verwenden.

void deleteJobNode(struct jobNode *node) { 
    free(node); // will do the whole job 
} 

Denn wenn man etwas Speicher mit einem malloc Anruf zuweisen diese ein großes Bündel Speicher ist, der dann mit free sofort freigegeben werden.

Nur wenn Ihre Struktur Zeiger enthält, die selbst auf einen anderen dynamisch zugewiesenen Speicher zeigen, müssen Sie free mit diesen Strukturelementen aufrufen.

-1

Sie geben die Adresse einer lokalen Variablen (newNode) in der Funktion 'createJobNode' zurück. newNode hat keine Sichtbarkeit außerhalb der Funktion 'createJobNode'.Versuchen Sie Speicher für die newNode in Ihre Hauptfunktion zuweisen und geben sie als Parameter an die createJobNode wie diese

void createJobNode(struct jobNode* newNode, ...) 
{ 
    //Fill the fields of newNode 

} 

int main(void) 
{ 
    struct jobNode * newNode = malloc(sizeof(struct newNode)); 

    createJobNode(newNode, ...); 

} 

(in diesem Fall wäre es eine Lücke Funktion sein) Um die zugewiesene Variable newNode zu befreien, müssen Sie Anruf:

free(newNode); 
+0

Diese Antwort bezieht sich nicht auf das gestellte Problem. –

+0

@Luis Colorado vor dem Kommentieren sollten die Benutzer die Frage und Antworten richtig lesen. Wir sind hier nicht nur dazu da, die richtige Antwort auf eine Frage zu bringen, sondern auch eine schlechte Codierung zu korrigieren (wie eine C-Funktion, die eine lokale Variablenadresse zurückgibt). – shamba

+0

hast du recht im ersten Satz. Aber überflutet den normalen Antwortstrahl mit ohne Beziehung zu den Problemdetails ohne mitwirkende Sachen befasst sich mit Fragen ohne Interesse, wenn überhaupt, an irgendjemanden (sogar an den Fragesteller) Diese Seite ist nicht nur ein Forum, wo man um Ihr Problem bitten kann, aber Probleme dienen vielen Menschen (nicht nur dem Fragesteller), um nach tatsächlichem Code zu fragen. Das nächste Mal, wenn Sie etwas zeigen, das nichts mit dem Problem zu tun hat, machen Sie es in den Kommentaren, nicht in der Antwort. Sie werden es nicht downvoted bekommen. –

Verwandte Themen