根据 valgrind 的说法,使用 OpenMP 编译简单的 hello-world 程序时可能会导致内存泄漏。这是没有意义的,因为 hello-world 程序并没有有意使用任何 OpenMP 功能。
假设下面的程序名为hi.c
并根据
$ gcc -o hi hi.c
海湾合作委员会版本4.8.3
#include <stdio.h>
int main( void )
{
printf( "hi\n" );
return 1;
}
我们应该期待来自 valgrind 的泄漏报告来验证显而易见的事实:没有泄漏。我的观察与这个假设一致:
$ valgrind --tool=memcheck ./hi
==13064== Memcheck, a memory error detector
==13064== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==13064== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info
==13064== Command: ./hi
==13064==
hi
==13064==
==13064== HEAP SUMMARY:
==13064== in use at exit: 0 bytes in 0 blocks
==13064== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==13064==
==13064== All heap blocks were freed -- no leaks are possible
==13064==
==13064== For counts of detected and suppressed errors, rerun with: -v
==13064== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
我还希望在与其他标志编译后收到相同的报告。然而,这种情况并非如此。当我用-fopenmp
标志,我观察到内存泄漏
$ gcc -fopenmp -o hi hi.c
$ valgrind --tool=memcheck ./hi
==13084== Memcheck, a memory error detector
==13084== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==13084== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info
==13084== Command: ./hi
==13084==
hi
==13084==
==13084== HEAP SUMMARY:
==13084== in use at exit: 8 bytes in 1 blocks
==13084== total heap usage: 2 allocs, 1 frees, 32,824 bytes allocated
==13084==
==13084== LEAK SUMMARY:
==13084== definitely lost: 0 bytes in 0 blocks
==13084== indirectly lost: 0 bytes in 0 blocks
==13084== possibly lost: 0 bytes in 0 blocks
==13084== still reachable: 8 bytes in 1 blocks
==13084== suppressed: 0 bytes in 0 blocks
==13084== Rerun with --leak-check=full to see details of leaked memory
==13084==
==13084== For counts of detected and suppressed errors, rerun with: -v
==13084== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
有谁明白为什么使用 OpenMP 编译会导致内存泄漏?尽管这个特定的程序不会调用 OpenMP,但我想确保在最终使用内存时能够正确处理内存。