内存泄漏 - OpenMP

时间:2016-08-08 15:01:09

标签: c++ memory-leaks openmp valgrind

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。 任何人都可以给我一个提示,如何解决这个记忆问题?

1 个答案:

答案 0 :(得分:1)

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

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

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

找出正在发生的事情的一种方法是在一种模式下使用valgrind,它会向你显示它认为泄露的特定项目。我通常使用

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

这将转储更多信息,允许您追踪valgrind认为泄漏来自哪里。使用堆栈跟踪valgrind让您弄清楚是否可以安全地忽略&#34;泄漏&#34;因为你无法做任何事情,或者你需要修改你正在编写的代码。