内存泄漏 - OpenMP

问题描述 投票:0回答:2

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
。 谁能给我一个提示,如何解决这个内存问题?

c++ memory-leaks openmp valgrind
2个回答
1
投票

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

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

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

弄清楚发生了什么的一种方法是在一种模式下使用 valgrind,它会向您显示它认为泄露的具体项目。我通常用

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

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


0
投票

哈哈,我好几年前就问过这个问题了。答案很简单。最重要的是,“仍然可达”并不是内存泄漏,正如 valgrind 文档中所说的那样

“仍然可达”意味着你的程序可能没问题——它没有释放它可能拥有的一些内存。这是很常见的,而且往往是合理的。如果您不想看到这些报告,请不要使用 --show-reachable=yes。

另一部分:

possibly lost: 1,776 bytes in 3 blocks

正如您可以在 bugzilla 或 openmp 中的 memleak 中读到的那样,这不是内存泄漏。

或者用openmp中的

memleak的话来说:

简而言之,看起来像是内存泄漏,但事实并非如此。这只是一个与 OpenMP 和 Valgrind 有关的问题。

© www.soinside.com 2019 - 2024. All rights reserved.