我有一个奇怪的内存泄漏,似乎是库函数 to_unbounded_string 泄漏了!
代码片段:
procedure Parse (Str : in String;
...做事...
declare
New_Element : constant Ada.Strings.Unbounded.Unbounded_String :=
Ada.Strings.Unbounded.To_Unbounded_String (Str); -- this leaks
begin
valgrind 输出:
==6009== 10,276 bytes in 1 blocks are possibly lost in loss record 153 of 153
==6009== at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==6009== by 0x42703B8: __gnat_malloc (in /usr/lib/libgnat-4.4.so.1)
==6009== by 0x4269480: system__secondary_stack__ss_allocate (in /usr/lib/libgnat-4.4.so.1)
==6009== by 0x414929B: ada__strings__unbounded__to_unbounded_string (in /usr/lib/libgnat-4.4.so.1)
==6009== by 0x80F8AD4: syntax__parser__dash_parser__parseXn (token_parser_g.adb:35)
其中 token_parser_g.adb:35 在上面列为“-- this leaks”行。
其他信息:Gnatmake 版本 4.4.5。 gcc 版本 4.4 valgrind 版本 valgrind-3.6.0.SVN-Debian,valgrind 选项 -v --leak-check=full --read-var-info=yes --show-reachable=no
感谢任何帮助或见解,
新创建。
最佳答案
Valgrind 明确表示可能存在内存泄漏。这并不一定意味着有一个。例如,如果对该函数的第一次调用分配了一个内存池,该内存池在程序的生命周期内被重新使用但从未被释放,Valgrind 将报告它为可能的内存泄漏,即使它不是,因为这是一种常见的做法是,内存将在进程终止时返回给操作系统。
现在,如果您认为确实存在内存泄漏,请在循环中调用此函数,然后看到内存继续增长。如果确实如此 - 提交错误报告或什至更好,尝试查找并修复泄漏并发送补丁和错误报告。
希望对您有所帮助。
关于memory-leaks - Ada.Strings.Unbounded 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7354669/