Ich habe ein paar allocs aus dem libleak-log rausgepickt -> https://pastebin.com/raw/Tsjyp43M Das sind überwiegend reallocs. callstack[2957]z.B. ist da richtig gut dabei. Vielleicht hilfts ja.
Libleak hatte ich letztes Jahr oder so auch schon mal versucht. Leider bekommt man da alle EPG-Einträge als falsch positiv angezeigt, weil die z.T. eine Lebensdauer von 2Wochen oder sogar mehr haben.
vdr-2.5.1/epg.c:186
186 title = strcpyrealloc(title, Title);
vdr-2.5.1/epg.c:196
196 description = strcpyrealloc(description, Description);
vdr-2.5.1/epg.c:191
191 shortText = strcpyrealloc(shortText, ShortText);
vdr-2.5.1/epg.c:94
94 p->description = strcpyrealloc(p->description, !isempty(Description) ? Description : NULL);
136 cEvent::~cEvent() 137 {
138 free(title);
139 free(shortText);
140 free(description);
Alles anzeigen
Für mich sieht es aber aus, als ob die Bereiche korrekt wieder freigegeben werden.
Das würde ich auch bei den Anderen sagen.
Allenfalls könnte bei den "components" irgendwo ein Rechenfehler beim Index vorliegen, da sollte nochmal wer anders einen Blick drauf werfen.
Die Meldungen kannst du IMHO jedenfalls ignorieren und raus filtern, sonst siehst du den Wald vor Bäumen nicht.
Ich schätze aber, danach bleibt auch noch eine Menge über.
Ich hatte es damals übrigens anders herum versucht, das EPG zu unterdrücken. Das hat aber nicht wirklich gut geklappt.
Man könnte noch versuchen den EPG periodisch mittels svdrp "CLRE" zu leeren, so dass die Einträge nicht älter als "LEAK_EXPIRE"
werden können. Das hatte ich noch nicht versucht.
Auf einem Produktiv-System mit EPGsearch ist das halt keine gute Idee und ich habe am Arbeitsplatzrechner leider keinen DVB-Empfang.
Was mit aber aufgefallen ist, dass hier ganz oft 1byte alloziert wird, auch wenn strlen(ShortText) == 0 ist. Wäre es nicht richtig, es so zu machen, wie hier?
IMHO ist es legitim leere Strings zu erzeugen.
Es kann am Ende praktischer sein, einmal sicherzustellen, dass der String existiert, als immer wieder auf Nullpointer abfragen zu müssen.
Viel Speicher braucht das auch nicht.
Wobei mir eben die Zeile aufgefallen ist:
strlen(dest) +1 kann doch kleiner sein als der reservierte Block?
Der Block kann dann doch kleiner werden, aber halt erst beim zweiten Aufruf der Funktion.
Oder täusche ich mich da?
Ein Speicherleck ist das aber wohl eher nicht.