Я широко использую векторы stl для управления выделением памяти большими массивами данных. В частности, я создаю перспективные проекции анатомических структур с большим количеством углов (180 с шагом 2 градуса), обрабатываю и анализирую результаты. Результаты используются для определения полей излучения для лучевой терапии.
Кажется, что если массивы превышают определенный размер (> 3 анатомических структуры), то память переполняется. В частности, ошибка заключается в следующем
прекращение вызова после выброса экземпляра 'std :: out_of_range'
что (): вектор :: _ M_range_check
Это результат использования at, который выполняет проверку границ, а не более быстрого оператора []. Если у меня <= 3 структуры, ошибка не возникает. </p>
Я отследил ошибку до следующего блока кода
bool dicomCP::assignBeamlet(int beamletNumber, Beamlet &b1)
{
//std::cout << "\nInside dicomCP::assignBeamlet (int, Beamlet &)\n";
if (!this->isSet)
{
this->beamlets.at(beamletNumber).setLeftRight(b1.left,b1.right);
this->isSet=true;
return true;
}
else if (!this->beamlets.at(beamletNumber-1).isOpen())
{
return false;
}
// left (outside) min(left) and right (outside) max(right) leaves
else if ((this->beamlets.at(beamletNumber-1).right-b1.left >EPSILON2)&&(b1.right-this->beamlets.at(beamletNumber-1).left>EPSILON2))
{
if (this->beamlets.at(beamletNumber).open) return false;
else if (!this->beamlets.at(beamletNumber).open)
{
this->beamlets.at(beamletNumber).setLeftRight(b1.left,b1.right);
this->beamlets.at(beamletNumber).isAssigned=true;
this->isSet=true;
return true;
}
}
else return false;
}
Обратите внимание, что если "this-> isSet = true;" строки закомментированы, ошибка не проявляется независимо от количества структур: да, она работает с 6! Логическое значение isSet используется для определения того, какие объекты были установлены, и, следовательно, какие объекты необходимо записать в файл данных для дальнейшей обработки.
Система и программное обеспечение:
gcc (SUSE Linux) 4.4.1 [версия gcc-4_4-branch 150839]
SuSE 11.2 64bit
Intel Celsius с 4 процессорами Xeon 2,66 ГГц и 4 ГБ оперативной памяти
Eclipse CDT (IDE) 64 бит, сборка 20100218-1602