我正在尝试按照以下概述的指示,在C++中异步读写磁盘(使用Ubuntu 10.04中的posix aio库):aio tutorial。我可以异步读取和写入,但是恐怕会发生某种形式的少量内存泄漏。我的valgrind输出说有288个可能丢失的字节,还有3,648个仍可到达的字节。这些数字似乎与实际从文件读取的字节数无关。我找不到在哪里或如何消除这种泄漏-甚至看起来这是aio库的问题。有没有人见过这个?完整的valgrind输出如下。提前致谢。

== 22330 ==
== 22330 ==堆摘要:
== 22330 ==在导出处使用:3,936字节,分为3个块
== 22330 ==总堆使用量:25个分配,22个释放,15,648个字节分配
== 22330 ==
== 22330 ==丢失记录1 of 3中仍然可以访问1块中的64个字节
== 22330 ==在0x4C274A8:malloc(vg_replace_malloc.c:236)
== 22330 ==通过0x4C27522:重新分配(vg_replace_malloc.c:525)
== 22330 ==通过0x504CAF1:__aio_enqueue_request(aio_misc.c:127)
== 22330 ==通过0x504D25A:aio_read(aio_read.c:30)
== 22330 ==通过0x406EB7:baio::read(std::string,char *,long)(baio_unix.cxx:58)
== 22330 ==通过0x40613E:test_read_helper(char *)(test_read.cxx:16)
== 22330 ==通过0x4063E1:test_read()(test_read.cxx:54)
== 22330 ==通过0x40664C:test_read_main(int,char **)(test_read.cxx:74)
== 22330 ==通过0x40959D:teSTLib_run_test_unit(unsigned long,int,char **)(teSTLib_main.cxx:116)
== 22330 ==通过0x4097A9:teSTLib_main(int,char **)(teSTLib_main.cxx:155)
== 22330 ==通过0x4060B4:main(test_driver.cxx:12)
== 22330 ==
== 22330 ==丢失记录2之3中可能会丢失1块中的288字节
== 22330 == at 0x4C267CC:calloc(vg_replace_malloc.c:467)
== 22330 ==通过0x4012395:_dl_allocate_tls(dl-tls.c:300)
== 22330 ==通过0x4E34728:pthread_create @@ GLIBC_2.2.5(allocatestack.c:561)
== 22330 ==通过0x504C9A8:__aio_enqueue_request(aio_misc.h:60)
== 22330 ==通过0x504D25A:aio_read(aio_read.c:30)
== 22330 ==通过0x406EB7:baio::read(std::string,char *,long)(baio_unix.cxx:58)
== 22330 ==通过0x40613E:test_read_helper(char *)(test_read.cxx:16)
== 22330 ==通过0x4063E1:test_read()(test_read.cxx:54)
== 22330 ==通过0x40664C:test_read_main(int,char **)(test_read.cxx:74)
== 22330 ==通过0x40959D:teSTLib_run_test_unit(unsigned long,int,char **)(teSTLib_main.cxx:116)
== 22330 ==通过0x4097A9:teSTLib_main(int,char **)(teSTLib_main.cxx:155)
== 22330 ==通过0x4060B4:main(test_driver.cxx:12)
== 22330 ==
== 22330 ==丢失记录3之3中仍可访问1块中的3,584字节
== 22330 == at 0x4C267CC:calloc(vg_replace_malloc.c:467)
== 22330 ==通过0x504CA27:__aio_enqueue_request(aio_misc.c:139)
== 22330 ==通过0x504D25A:aio_read(aio_read.c:30)
== 22330 ==通过0x406EB7:baio::read(std::string,char *,long)(baio_unix.cxx:58)
== 22330 ==通过0x40613E:test_read_helper(char *)(test_read.cxx:16)
== 22330 ==通过0x4063E1:test_read()(test_read.cxx:54)
== 22330 ==通过0x40664C:test_read_main(int,char **)(test_read.cxx:74)
== 22330 ==通过0x40959D:teSTLib_run_test_unit(unsigned long,int,char **)(teSTLib_main.cxx:116)
== 22330 ==通过0x4097A9:teSTLib_main(int,char **)(teSTLib_main.cxx:155)
== 22330 ==通过0x4060B4:main(test_driver.cxx:12)
== 22330 ==
== 22330 ==泄漏摘要:
== 22330 ==绝对丢失:0个字节(0块)
== 22330 ==间接丢失:0个字节,共0个块
== 22330 ==可能丢失:1个块中的288个字节
== 22330 ==仍可到达:2块中的3,648字节
== 22330 ==已抑制:0字节,0块

最佳答案

第二个块看起来像是与为处理异步读取而创建的库拥有的线程相关联的线程本地存储。

==22330==    by 0x4012395: _dl_allocate_tls (dl-tls.c:300)
==22330==    by 0x4E34728: pthread_create@@GLIBC_2.2.5 (allocatestack.c:561)

第一个和第三个看起来像与出色的异步读取关联的内部结构。

如果您只需要担心这一点就可以持续运行,我的本能就是对小怜悯心存感激。该库肯定必须有一定的自由度来分配持久性内存,以关联异步读取的结果。

关于c++ - aio.h aio_read()和写入内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4248720/

10-10 11:05