【问题标题】:Memory Leak - OpenMP内存泄漏 - OpenMP
【发布时间】:2016-08-08 15:01:08
【问题描述】:

valgrind 告诉我,我的代码中有以下问题:

LEAK SUMMARY:
==18114==    definitely lost: 0 bytes in 0 blocks
==18114==    indirectly lost: 0 bytes in 0 blocks
==18114==      possibly lost: 1,776 bytes in 3 blocks
==18114==    still reachable: 2,320 bytes in 4 blocks
==18114==         suppressed: 0 bytes in 0 blocks

这个问题出现在:

#pragma omp parallel for num_threads(numThreads)

parallelCalc= new Calculator[numOff];

    #pragma omp parallel for num_threads(numThreads) 
    for(int i = 1; i<=numOff;i++)
    {
        std::stringstream sstm;
        sstm << filename <<"/" << i<<".off";
        std::string aktFilename = sstm.str();


        Polyhedron *poly = new Polyhedron(aktFilename.c_str());
        parallelCalc[i-1].init(poly,consistentTargets->points,numTarget);
        parallelCalc[i-1].hfield();


        delete poly;
    }

我尝试在 openmp 中设置 parallelCalc 共享,(我认为这是问题所在,不是吗?)但是当我这样做时,我收到错误 MainController::parallelCalc is not a variable in clause shared。 谁能给我一个提示,如何解决这个内存问题?

【问题讨论】:

  • 你有什么理由在这里使用指针吗?如果不是,您应该使用循环本地自动对象。
  • 您确定问题与 omp 有关吗?如果禁用 omp,错误会消失吗?
  • 是的,串行版本没有内存问题。我认为它是相同的代码,只是没有#pragma omp,openmp 为每个线程生成私有 prarallelcalc,这就是泄漏的问题,不是吗?
  • 它必须是一个指针,因为我需要每个 porallelCalc 的结果。而且我只在运行时知道数组的大小。

标签: c++ memory-leaks openmp valgrind


【解决方案1】:

由于代码不完整,我们无法重现您的错误。

我看到一个潜在的记忆丧失。您有一个新的计算器调用,但没有匹配的删除。

此外,可能还有其他内存通过间接方式静态分配,无法释放。

找出发生了什么的一种方法是使用 valgrind 的模式,它会向您显示它认为已泄露的特定项目。我通常使用

valgrind --verbose --num-callers=30 --track-fds=yes --leak-check=full --show-reachable=yes

这将转储更多信息,以便您追踪 valgrind 认为泄漏的来源。使用 valgrind 提供的堆栈跟踪来确定是否可以安全地忽略“泄漏”,因为您对此无能为力,或者您是否需要修复正在编写的代码。

【讨论】:

  • 查看以下内容以了解可能的重复:stackoverflow.com/questions/26391389/…
  • 我不确定,这是一样的。当我将parallelCalc = new parallelCalc() 并在for 循环中删除parallelCalc 时,我没有得到任何泄漏,但我需要parallelCalc 的结果。
  • 您是否使用'delete [] parallelCalc'来删除parallelCalc?您是否尝试使用上述命令行选项运行 valgrind 以查看 valgrind 指向的内容?
  • 对不起,我的英语不够好,我再试一次。错误发生在#pragma omp parallel for num_threads(numThreads) 行中。我认为原因是 openmp 为每个线程生成 parallelCalcs。我还写了串行版本不会遇到内存泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2016-02-07
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2013-01-20
相关资源
最近更新 更多