2 Stimmen

Valgrind und globale Variablen

Ich lasse valgrind laufen, um nach Speicherlecks zu suchen. Ich habe zwei globale Variablen in der Hauptfunktion zugewiesen; dann, am Ende von main Ich gebe beides frei, aber Valgrind schreibt weiter:

==18311== 16 bytes in 1 blocks are definitely lost in loss record 1 of 2
==18311==    at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==18311==    by 0x804A30C: main (application.c:730)
==18311== 
==18311== 16 bytes in 1 blocks are definitely lost in loss record 2 of 2
==18311==    at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==18311==    by 0x804A31D: main (application.c:731)

Zusammenfassung des Lecks:

==18311== LEAK SUMMARY:
==18311==    definitely lost: 32 bytes in 2 blocks
==18311==    indirectly lost: 0 bytes in 0 blocks
==18311==      possibly lost: 0 bytes in 0 blocks
==18311==    still reachable: 0 bytes in 0 blocks
==18311==         suppressed: 0 bytes in 0 blocks

Warum kann ich diese beiden Variablen nicht freigeben?

Modifier

someList *something; *something_else;

Die verwendete Struktur hat zwei Felder vom Typ char * und ein Feld someList *next . Später gibt es eine Menge Code. Einige Threads werden mit Hilfe dieser beiden Variablen Objekte hinzufügen/bearbeiten/löschen.

something -> object 1 -> ... -> object n
something_else -> object 1 -> ... -> object m

-> bedeutet, dass something->next = object 1 und object k sind alle Instanzen von someList * .

Gegen Ende der Anwendung habe ich jedes Feld der einzelnen object k Element. Dann, im letzten Teil:

free(something);
free(something_else);

Es ist möglich, dass ich vergessen habe, ein Feld eines Objekts freizugeben. Kann dies das Verhalten verursachen, das ich hier habe?

Ich hoffe, das ist jetzt klarer.

1voto

peoro Punkte 24751

Sind Sie sicher, dass Sie alle Ihre Variablen deallokieren? Valgrind sagt, Sie tun es nicht.

Versuchen Sie, Ihren Code schlank zu machen und posten Sie ihn hier, oder führen Sie weitere Fehlersuche durch.

0voto

thkala Punkte 80165

Für jede malloc() Anruf benötigen Sie in der Regel eine entsprechende free() Aufruf, um Speicherlecks zu vermeiden. Um den Speicher optimal zu nutzen, sollten Sie free() Jeder zugewiesene Speicherblock wird so schnell wie möglich wieder gelöscht, wenn er nicht mehr benötigt wird.

In Ihrem Fall haben Sie zwei malloc() Anrufe application.c:730 y application.c:731 , für die es keine free() Aufruf, der zum Zeitpunkt der Beendigung Ihres Programms erfolgt ist. Daher werden die dort zugewiesenen Speicherblöcke nicht freigegeben. Dies verursacht ein Speicherleck, das Valgrind erkennt und meldet.

Solange Sie uns keinen Code und/oder weitere Informationen über Ihr Programm zur Verfügung stellen, können wir Ihnen nicht weiterhelfen.

EDIT :

Es gibt zwei interessante Zeilen in Ihrem Valgrind Ausgabe:

==18311==    definitely lost: 32 bytes in 2 blocks
...
==18311==    still reachable: 0 bytes in 0 blocks

Sie haben definitiv zwei Speicherblöcke "verloren" und es gibt keine Zeiger auf sie, wenn Ihr Programm beendet wird. Das bedeutet, dass die Zeiger auf diese beiden Blöcke im Laufe Ihres Programms überschrieben wurden oder anderweitig ihren Wert verloren haben.

Eine häufige Ursache für dieses Problem ist die Speicherung des Ergebnisses von zwei malloc() Aufrufe an denselben Zeiger ohne Zwischenschaltung eines free() rufen. Eine weitere mögliche Ursache ist ein veränderter Zeigerwert aufgrund von Zeigerarithmetikoperationen - Valgrind bemüht sich, einige dieser Fälle zu erkennen, ist aber nicht immer erfolgreich, je nach Ihrem Code.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X