Speicherleck mit sanitize, aber nicht mit velgrind?
Ich habe mehrere C-Dateien erstellt, mit H-Dateien verbunden und danach auf Speicherlecks überprüft. Wichtig zu erwähnen ist dabei, das ich das ganze mit gkt und glade gemacht habe. Nun habe ich velgrind verwendet, um zu schauen, ob ich evt Speicherlecks habe. Als Ergebnis bekam ich, das keine Speicherlecks gefunden wurden. Um das nochmal zu überprüfen habe ich auch fsanitize benutzt, wobei Speicherlecks von 85.000 Bytes herauskamen.
Jetzt ist meine Frage dazu, wie das sein kann. An sich habe ich immer free benutzt, wenn ich Speicher belegt habe (etwa mit malloc oder strdup) und um den Speicher der gtk_widgets sollte sich eigentlich glade kümmern (soweit ich das richtig gelesen habe). Ich habe auch am Ende meines Codes, nach gtk_main(); noch g_object_unref(builder); angegeben, um den speicher, den der builder belegt freizugeben.
Ich habe mir jetzt schonmal Gedanken dazu gemacht. In meinem Kopf würde es Sinn machen, das fsanitize den nicht erkennt, wenn Gtk den Speicher freigibt und deswegen so viele Lecks findet. Jedoch habe ich auch gelesen, das fsanitize eigentlich präziser als velgrind ist. Jetzt bin ich natürlich verwirrt und würde mich über eine Expertenmeinung freuen.
Anbei vielleicht noch: es ist eher ein kleines programm, welches nur materialen (aus einer txt-Datei) in ein gtk_tree_view einfügt, wo man nach einer Artikelnummer suche kann, einen Eintrag löschen kann und auch einen neuen erstellen kann. Deswegen kann ich mir auch schonmal gar nicht vorstellen, das 85.000Bytes als Speicheleck erkannt werden können.
Ich freue mich über jede Hilfe :)
1 Antwort
Grundsätzlich: Nur weil ein Analyzer sagt, daß er kein Leck findet, bedeutet das noch lange nicht, daß keines vorhanden ist.
Ein False Positive ist da schon deutlich unwahrscheinlicher.
Eigentlich sollte der Sanitizer Dir doch Auskunft darüber geben können, wo das Problem auftritt.
das fsanitize den nicht erkennt, wenn Gtk den Speicher freigibt und deswegen so viele Lecks findet.
Warum? Man sollte doch meinen, daß der Sanitizer sowas wie ein atexit() macht, um sicherzustellen, daß er nicht vorzeitig 'beendet' wird.