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;
}
您必須小心使用庫,因爲有些分配內存塊供庫本身使用,並不特別關於釋放依賴於程序退出的內存來處理內存。對於更大,更知名的庫,已經公佈了'valgrind'的排除列表來說明這種類型的分配(例如'GTK +'等)。我對geoip知之甚少,無法告訴您是否發生了這種情況,但從您的代碼判斷,它看起來像是分配的內存的典型症狀,這並不在您的控制範圍之內。 –
謝謝你指出。我開始認爲可能是這樣。 –
如果你再次調用GeoIP_new和GeoIP_delete(總共兩次),那麼它會增加到10塊嗎? – immibis