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
。
谁能给我一个提示,如何解决这个内存问题?
我们无法重现您的错误,因为代码不完整。
我看到一种潜在的记忆丧失。您有一个新的计算器调用,但没有匹配的删除。
此外,可能还有其他通过间接方式静态分配的内存,无法释放。
弄清楚发生了什么的一种方法是在一种模式下使用 valgrind,它会向您显示它认为泄露的具体项目。我通常用
valgrind --verbose --num-callers=30 --track-fds=yes --leak-check=full --show-reachable=yes
这将转储更多信息,让您能够追踪 valgrind 认为泄漏的来源。使用 valgrind 提供的堆栈跟踪来确定是否可以安全地忽略“泄漏”,因为您对此无能为力,或者是否需要修复正在编写的代码。
哈哈,我好几年前就问过这个问题了。答案很简单。最重要的是,“仍然可达”并不是内存泄漏,正如 valgrind 文档中所说的那样
“仍然可达”意味着你的程序可能没问题——它没有释放它可能拥有的一些内存。这是很常见的,而且往往是合理的。如果您不想看到这些报告,请不要使用 --show-reachable=yes。
另一部分:
possibly lost: 1,776 bytes in 3 blocks
正如您可以在 bugzilla 或 openmp 中的 memleak 中读到的那样,这不是内存泄漏。
或者用openmp中的memleak的话来说:
简而言之,看起来像是内存泄漏,但事实并非如此。这只是一个与 OpenMP 和 Valgrind 有关的问题。