使用OpenMP时内存泄漏

Wil*_*mKF 5 multithreading gcc memory-leaks openmp allocator

下面测试用例运行的内存上在回路下列当使用OpenMP的"后MT节"消息32台机器(投掷的std :: bad_alloc的),但是,如果表示OpenMP的编译指示被注释的那样,代码运行通过完成精细,所以会出现,当内存并行线程分配,它不是免费的正确,因此,我们耗尽内存.

问题是下面的内存分配和删除代码是否有问题,或者这是gcc v4.2.2或OpenMP中的错误?我也试过gcc v4.3并且失败了.

int main(int argc, char** argv)
{
    std::cout << "start " << std::endl;

    {
            std::vector<std::vector<int*> > nts(100);
            #pragma omp parallel
            {
                    #pragma omp for
                    for(int begin = 0; begin < int(nts.size()); ++begin) {
                            for(int i = 0; i < 1000000; ++i) {
                                    nts[begin].push_back(new int(5));
                            }
                    }
            }

    std::cout << "  pre delete " << std::endl;
            for(int begin = 0; begin < int(nts.size()); ++begin) {
                    for(int j = 0; j < nts[begin].size(); ++j) {
                            delete nts[begin][j];
                    }
            }
    }
    std::cout << "post MT section" << std::endl;
    {
            std::vector<std::vector<int*> > nts(100);
            int begin, i;
            try {
              for(begin = 0; begin < int(nts.size()); ++begin) {
                    for(i = 0; i < 2000000; ++i) {
                            nts[begin].push_back(new int(5));
                    }
              }
            } catch (std::bad_alloc &e) {
                    std::cout << e.what() << std::endl;
                    std::cout << "begin: " << begin << " i: " << i << std::endl;
                    throw;
            }
            std::cout << "pre delete 1" << std::endl;

            for(int begin = 0; begin < int(nts.size()); ++begin) {
                    for(int j = 0; j < nts[begin].size(); ++j) {
                            delete nts[begin][j];
                    }
            }
    }

    std::cout << "end of prog" << std::endl;

    char c;
    std::cin >> c;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Wil*_*mKF 3

我在其他地方发现了这个问题,没有使用 OpenMP,而只是使用 pthreads。多线程时的额外内存消耗似乎是标准内存分配器的典型行为。通过切换到Hoard分配器,额外的内存消耗就会消失。