0
Ich habe den folgenden Code auf GeoIP 1.4.8 und 1.6.6 versucht und es nur 5 Allozierungen von 40 Alloks freigegeben, die von Valgrind gemeldet werden.Möglicher Speicherverlust auf GeoIP_new API in C
Ich bin mir der "immer noch erreichbar" nach dieser post, aber ich möchte sicherstellen, dass das der Fall ist hier. Es scheint mir merkwürdig, dass ich nur 5 Alloks freigebe. Irgendwelche Ideen?
==1687== HEAP SUMMARY:
==1687== in use at exit: 35,128 bytes in 35 blocks
==1687== total heap usage: 40 allocs, 5 frees, 36,847 bytes allocated
==1687==
==1687== 312 bytes in 1 blocks are still reachable in loss record 1 of 35
==1687== at 0x4C2C947: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1687== by 0x4E3DA5E: _GeoIP_setup_dbfilename (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x4E3E789: GeoIP_new (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x40075E: main (in /home/pixie/a.out)
==1687==
==1687== 1,024 bytes in 1 blocks are still reachable in loss record 2 of 35
==1687== at 0x4C2C947: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1687== by 0x4E3D9A5: _GeoIP_full_path_to (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x4E3DA70: _GeoIP_setup_dbfilename (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x4E3E789: GeoIP_new (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x40075E: main (in /home/pixie/a.out)
==1687==
==1687== 1,024 bytes in 1 blocks are still reachable in loss record 3 of 35
==1687== at 0x4C2C947: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1687== by 0x4E3D9A5: _GeoIP_full_path_to (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x4E3DA83: _GeoIP_setup_dbfilename (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x4E3E789: GeoIP_new (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x40075E: main (in /home/pixie/a.out)
==1687==
==1687== 1,024 bytes in 1 blocks are still reachable in loss record 4 of 35
==1687== at 0x4C2C947: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1687== by 0x4E3D9A5: _GeoIP_full_path_to (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x4E3DA96: _GeoIP_setup_dbfilename (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x4E3E789: GeoIP_new (in /usr/lib/libGeoIP.so.1.6.6)
==1687== by 0x40075E: main (in /home/pixie/a.out)
...
-Code
#include <GeoIP.h>
int main (int argc, char **argv) {
GeoIP * gp;
gp = GeoIP_new(GEOIP_STANDARD);
printf("%s\n", GeoIP_country_code_by_addr(gp, "216.58.216.238"));
GeoIP_delete(gp);
return 0;
}
Sie müssen vorsichtig mit Bibliotheken sein, da einige Speicherblöcke für die Bibliothek selbst reservieren und es nicht besonders wichtig ist, den Speicher freizugeben, der auf den Programm-Exit angewiesen ist. Für die größeren, bekannteren Bibliotheken gibt es veröffentlichte Ausschlusslisten für "Valgrind", um diese Art der Zuweisung zu berücksichtigen (z.B. "GTK +", usw.). Ich weiß nicht genug über geoip, um dir zu sagen, ob das passiert ist, aber nach deinem Code zu urteilen, sieht es wie die klassischen Symptome des zugewiesenen Speichers aus, die du nicht kontrollieren kannst. –
Vielen Dank, dass Sie darauf hingewiesen haben. Ich fange an zu denken, dass das wahrscheinlich der Fall ist. –
Wenn Sie GeoIP_new und GeoIP_delete erneut aufrufen (also jeweils zweimal), erhöht sich die Anzahl auf 10 Blöcke? – immibis