В нижеприведенном тестовом случае на 32-разрядных машинах (бросание std :: bad_alloc) в цикле после сообщения «пост MT-раздела» при использовании OpenMP используется ниже, если #pragmas for OpenMP закомментирован, код заканчивается до завершения, поэтому появляется, что, когда память распределяется в параллельных потоках, она не освобождается правильно и, следовательно, у нас заканчивается память.Утечка памяти при использовании 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;
}
Когда я запускаю это под Windows, построенным с помощью компилятора Intel, мои распределения начинают сбой в первом цикле из-за попадания предела 2gb для 32-битного процесса. Возможно ли, что накладные расходы OpenMP просто подталкивают ваш процесс к любому пределу на вашей платформе? – Scott 2010-12-02 16:00:59
@Scott Danahy Попробуйте изменить тестовый кейс, чтобы сократить все распределения пополам, этот тест работал с пределом 4 ГБ. – WilliamKF 2010-12-02 19:28:09