内存泄漏- OpenMP

Memory Leak - OpenMP

本文关键字:OpenMP 泄漏 内存      更新时间:2023-10-16

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;
    }

我试图设置并行calc共享在openmp,(我认为这是问题,不是吗?),但当我这样做,我得到错误MainController::parallelCalc is not a variable in clause shared。谁能给我一个提示,如何解决这个记忆问题?

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

我看到一个潜在的记忆丧失。您有一个新的Calculator调用,但没有匹配的delete。

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

要弄清楚发生了什么,一种方法是在一种模式下使用valgrind,它会显示它认为被泄露的特定项。我通常使用

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

这将转储更多的信息,允许您跟踪valgrind认为泄漏来自何处。使用valgrind提供的堆栈跟踪来确定您是否可以安全地忽略"泄漏",因为您无法对此做任何事情,或者您是否需要修复正在编写的代码。