2010-11-22 16 views
2

Ich versuche asynchron auf Festplatte in C++ zu lesen und zu schreiben (mit der Posix AIO-Bibliothek in Ubuntu 10.04), die folgenden Anweisungen folgen: aio tutorial. Ich kann asynchron lesen und schreiben, aber ich befürchte, dass es ein kleines Speicherleck gibt. Meine Valgrind-Ausgabe besagt, dass es 288 möglicherweise verlorene Bytes und 3.648 noch erreichbare Bytes gibt. Diese Zahlen scheinen unabhängig von der Anzahl der tatsächlich von der Datei gelesenen Bytes zu sein. Ich kann nicht finden, wo oder wie dieses Leck zu beseitigen - und es sieht sogar aus wie ein Problem mit der AIO-Bibliothek. Hat das jemand schon mal gesehen? Die gesamte Valgrind-Ausgabe ist unterhalb. Danke im Voraus.aio.h aio_read() und schreiben Speicherleck

 
==22330== 
==22330== HEAP SUMMARY: 
==22330==  in use at exit: 3,936 bytes in 3 blocks 
==22330== total heap usage: 25 allocs, 22 frees, 15,648 bytes allocated 
==22330== 
==22330== 64 bytes in 1 blocks are still reachable in loss record 1 of 3 
==22330== at 0x4C274A8: malloc (vg_replace_malloc.c:236) 
==22330== by 0x4C27522: realloc (vg_replace_malloc.c:525) 
==22330== by 0x504CAF1: __aio_enqueue_request (aio_misc.c:127) 
==22330== by 0x504D25A: aio_read (aio_read.c:30) 
==22330== by 0x406EB7: baio::read(std::string, char*, long) (baio_unix.cxx:58) 
==22330== by 0x40613E: test_read_helper(char*) (test_read.cxx:16) 
==22330== by 0x4063E1: test_read() (test_read.cxx:54) 
==22330== by 0x40664C: test_read_main(int, char**) (test_read.cxx:74) 
==22330== by 0x40959D: testlib_run_test_unit(unsigned long, int, char**) (testlib_main.cxx:116) 
==22330== by 0x4097A9: testlib_main(int, char**) (testlib_main.cxx:155) 
==22330== by 0x4060B4: main (test_driver.cxx:12) 
==22330== 
==22330== 288 bytes in 1 blocks are possibly lost in loss record 2 of 3 
==22330== at 0x4C267CC: calloc (vg_replace_malloc.c:467) 
==22330== by 0x4: _dl_allocate_tls (dl-tls.c:300) 
==22330== by 0x4E34728: [email protected]@GLIBC_2.2.5 (allocatestack.c:561) 
==22330== by 0x504C9A8: __aio_enqueue_request (aio_misc.h:60) 
==22330== by 0x504D25A: aio_read (aio_read.c:30) 
==22330== by 0x406EB7: baio::read(std::string, char*, long) (baio_unix.cxx:58) 
==22330== by 0x40613E: test_read_helper(char*) (test_read.cxx:16) 
==22330== by 0x4063E1: test_read() (test_read.cxx:54) 
==22330== by 0x40664C: test_read_main(int, char**) (test_read.cxx:74) 
==22330== by 0x40959D: testlib_run_test_unit(unsigned long, int, char**) (testlib_main.cxx:116) 
==22330== by 0x4097A9: testlib_main(int, char**) (testlib_main.cxx:155) 
==22330== by 0x4060B4: main (test_driver.cxx:12) 
==22330== 
==22330== 3,584 bytes in 1 blocks are still reachable in loss record 3 of 3 
==22330== at 0x4C267CC: calloc (vg_replace_malloc.c:467) 
==22330== by 0x504CA27: __aio_enqueue_request (aio_misc.c:139) 
==22330== by 0x504D25A: aio_read (aio_read.c:30) 
==22330== by 0x406EB7: baio::read(std::string, char*, long) (baio_unix.cxx:58) 
==22330== by 0x40613E: test_read_helper(char*) (test_read.cxx:16) 
==22330== by 0x4063E1: test_read() (test_read.cxx:54) 
==22330== by 0x40664C: test_read_main(int, char**) (test_read.cxx:74) 
==22330== by 0x40959D: testlib_run_test_unit(unsigned long, int, char**) (testlib_main.cxx:116) 
==22330== by 0x4097A9: testlib_main(int, char**) (testlib_main.cxx:155) 
==22330== by 0x4060B4: main (test_driver.cxx:12) 
==22330== 
==22330== LEAK SUMMARY: 
==22330== definitely lost: 0 bytes in 0 blocks 
==22330== indirectly lost: 0 bytes in 0 blocks 
==22330==  possibly lost: 288 bytes in 1 blocks 
==22330== still reachable: 3,648 bytes in 2 blocks 
==22330==   suppressed: 0 bytes in 0 blocks 

Antwort

2

Der zweite Block sieht wie lokale Fadenspeicher mit einer Bibliothek eigenen Thread zugeordnet erstellt async gelesen (s) zu behandeln.

==22330== by 0x4: _dl_allocate_tls (dl-tls.c:300) 
==22330== by 0x4E34728: [email protected]@GLIBC_2.2.5 (allocatestack.c:561) 

Die erste und dritte aussehen wie interne Strukturen mit einer hervorragenden Async lesen verbunden.

Wenn Sie für eine längere Zeit damit laufen können, sich Sorgen zu machen, wäre mein Instinkt dankbar für kleine Gnaden. Die Bibliothek muss sicherlich einen gewissen Spielraum haben, um persistenten Speicher zuzuordnen, um das Ergebnis für eine asynchrone Leseoperation zu korrelieren.

+1

Valgrind enthält eine Liste von Ausnahmen für verschiedene Standardbibliotheksdinge. Ich wette, niemand hat es geschafft, diese Liste für die aio-Bibliothek zu erstellen. – Omnifarious

+0

gut zu wissen - danke für die schnelle antwort. Ich hatte nur Angst, dass ich etwas nicht richtig säubere. – andy

+0

afai kann sehen, dass keine dieser "streunenden" Allocs wahrscheinlich aus Ihrem Code stammen –