memory-leaks - Ada任务声明导致内存泄漏

标签 memory-leaks valgrind ada

我有以下小 Ada 程序:

procedure Leaky_Main is 
   task Beer;
   task body Beer is 
   begin 
      null;
   end Beer;
begin 
   null;
end Leaky_Main;

一切都相当基本,但是当我像这样编译时:

gnatmake -g -gnatwI leaky_main.adb

并通过 Valgrind 运行它,如下所示:

valgrind --tool=memcheck -v --leak-check=full --read-var-info=yes --leak-check=full --show-reachable=yes ./leaky_main

我收到以下错误摘要:

==2882== 2,104 bytes in 1 blocks are still reachable in loss record 1 of 1
==2882==    at 0x4028876: malloc (vg_replace_malloc.c:236)
==2882==    by 0x42AD3B8: __gnat_malloc (in /usr/lib/i386-linux-gnu/libgnat-4.4.so.1)
==2882==    by 0x40615FF: system__task_primitives__operations__new_atcb (in /usr/lib/i386-linux-gnu/libgnarl-4.4.so.1)
==2882==    by 0x406433C: system__tasking__initialize (in /usr/lib/i386-linux-gnu/libgnarl-4.4.so.1)
==2882==    by 0x4063C86: system__tasking__initialization__init_rts (in /usr/lib/i386-linux-gnu/libgnarl-4.4.so.1)
==2882==    by 0x4063DA6: system__tasking__initialization___elabb (in /usr/lib/i386-linux-gnu/libgnarl-4.4.so.1)
==2882==    by 0x8049ADA: adainit (b~leaky_main.adb:142)
==2882==    by 0x8049B7C: main (b~leaky_main.adb:189)
==2882== 
==2882== LEAK SUMMARY:
==2882==    definitely lost: 0 bytes in 0 blocks
==2882==    indirectly lost: 0 bytes in 0 blocks
==2882==      possibly lost: 0 bytes in 0 blocks
==2882==    still reachable: 2,104 bytes in 1 blocks
==2882==         suppressed: 0 bytes in 0 blocks
==2882== 
==2882== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 21 from 6)
--2882-- 
--2882-- used_suppression:     21 U1004-ARM-_dl_relocate_object
==2882== 
==2882== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 21 from 6)

有谁知道为什么这被报告为错误? 我相当确定没有实际泄漏,但我想知道为什么/如何发生。

谢谢

最佳答案

有问题的分配看起来是任务控制 block (TCB)。任务完成后必须保留此信息,以便您可以说

if Beer’Terminated then
   ...

所以我认为这可能是 valgrind 进行检查时的人为因素。

我只在分配任务的地方遇到过这种情况;必须等到'TermiedTrue才释放任务,或者GNAT愉快地释放堆栈但默默地没有释放TCB,导致真正的泄漏,例如你的。 AdaCore 最近修复了这个问题(我没有引用资料,它在他们的开发者日志中)。

关于memory-leaks - Ada任务声明导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9549885/

相关文章:

arrays - 我如何在 Ada 中定义一个字符串数组?

android.database.CursorWindowAllocationException : Cursor window allocation of 2048 kb failed even after closing cursor

java - Stateless ejb 不删除池

c++ - Valgrind C++ : Invalid Read Of Size 8

C++ 机器人,家庭作业 - 由于内存泄漏而出现 valgrind 错误。真的需要一些提示

c - Valgrind 显示分配的内存比实际分配的内存多

spring-boot - Spring Boot 应用程序内存泄漏缓慢

ios - 关于自定义 tableView 单元格中内存泄漏的基本建议

variables - 如何检查变量的类型

ada - 在 Ada 中按下键