2016-05-14 36 views
0

我在GeoIP 1.4.8和1.6.6上試過以下代碼,它只釋放valgrind報告的40個alloc中的5個分配。在GeoIP_new API中可能發生內存泄漏C

我知道根據這post「仍然可以」,但我想確保在這裏的情況。對我來說,看起來很奇怪的只是釋放了5個分配。有任何想法嗎?

==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) 
... 

代碼

#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; 
} 
+0

您必須小心使用庫,因爲有些分配內存塊供庫本身使用,並不特別關於釋放依賴於程序退出的內存來處理內存。對於更大,更知名的庫,已經公佈了'valgrind'的排除列表來說明這種類型的分配(例如'GTK +'等)。我對geoip知之甚少,無法告訴您是否發生了這種情況,但從您的代碼判斷,它看起來像是分配的內存的典型症狀,這並不在您的控制範圍之內。 –

+0

謝謝你指出。我開始認爲可能是這樣。 –

+0

如果你再次調用GeoIP_new和GeoIP_delete(總共兩次),那麼它會增加到10塊嗎? – immibis

回答

1

顯然以下call做這項工作(未記載)。

GeoIP_cleanup();