TBB可能存在内存泄漏

时间:2013-05-16 21:57:29

标签: c++ c++11 memory-leaks valgrind tbb

测试程序:

#include <tbb/parallel_invoke.h>

int main(void)
{
    tbb::parallel_invoke([]{},[]{});
    return 0;
}
  1. 使用g++ -std=c++11 tmp.cpp -ltbb
  2. 进行编译
  3. 选中

    valgrind --tool=memcheck --track-origins=yes \
             --leak-check=full --log-file=report ./a.out`
    
  4. libtbb版本:4.0valgrind版本:3.8.1

  5. 上述测试结果的一部分:

    possibly lost: 1,980 bytes in 6 blocks
    

    问题是:

    这是TBB错误吗?

    或者这个possible lost实际上是否安全,只是valgrind认为不安全的一些代码?

1 个答案:

答案 0 :(得分:2)

最有可能的是,这是一个误报,而不是一个错误。至少有几个原因:

  1. TBB使用自己的内存分配器libtbbmalloc,它会缓存内存直到进程终止,并且可能显示为泄漏。
  2. TBB线程以异步方式运行和终止。很可能在main()终止后,工作线程仍在运行。它会给valgrind带来同样的印象。
  3. 为了合理控制TBB泄漏,请排除上述因素,例如:

    1. 删除libtbbmalloc.so.2或tbbmalloc.dll文件,因此运行带有env.variable TBB_VERSION=1的应用程序将输出TBB: ALLOCATOR malloc但不会TBB: ALLOCATOR scalable_malloc
    2. 确保所有TBB线程都已终止
    3. 例如

      int main()
      {
          assert(tbb::tbb_allocator<int>::allocator_type() != tbb::tbb_allocator<int>::scalable);
          { // TBB scope
              tbb::task_scheduler_init scope;
              tbb::parallel_invoke([]{},[]{});
          } // TBB threads start termination here
          sleep(10); // wait for threads to terminate
          return 0;
      }