我正在大量使用stl向量來管理大型數據陣列的內存(解除)分配。特別是,我從大量角度(180度,2度)產生解剖結構的透視投影,處理和分析結果。結果用於定義放射治療的輻射場。導致內存溢出的C++ stl向量?
看來,如果數組超過一定的大小(> 3解剖結構),內存溢出。尤其錯誤的是如下
扔「的std :: out_of_range」 什麼()的一個實例後終止稱爲:矢量:: _ M_range_check
這是在使用,這確實邊界檢查的結果,而不是更快的[]運算符。如果我有< = 3結構,則不會發生錯誤。
我已經跟蹤誤差降低到下面的代碼塊
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;
}
注意,如果「這 - > isSet = TRUE;」行被註釋掉了,不管結構的數量如何,錯誤都不會表現出來:是的,它可以和6一起工作! 「isSet」布爾值用於確定哪些對象已被設置,因此需要將哪些對象寫入數據文件以供進一步處理。
系統和sodtware:
GCC(SUSE Linux)的4.4.1 [GCC-4_4-分支修訂150839] 的SuSE 11.2 64個 英特爾攝氏4至強2.66GHz的CPU和RAM 4GB的Eclipse CDT(IDE )64位Build 20100218-1602
編寫一個最小測試應用程序來重現您正在觀察並粘貼到此處的行爲。但最可能的解釋是您的代碼存在問題,而不是STL。 – karlphillip 2010-12-20 16:28:03
花時間回顧您的其他問題並接受一些答案! – karlphillip 2010-12-20 16:28:21