2010-12-20 27 views
1

我正在大量使用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

+0

編寫一個最小測試應用程序來重現您正在觀察並粘貼到此處的行爲。但最可能的解釋是您的代碼存在問題,而不是STL。 – karlphillip 2010-12-20 16:28:03

+0

花時間回顧您的其他問題並接受一些答案! – karlphillip 2010-12-20 16:28:21

回答

2

顯然,您正在訪問容器外的元素。從這段代碼中不可能說出索引是否正確,在調試器中遍歷這段代碼,你會看到。可疑的作品:this->beamlets.at(beamletNumber-1).isOpen()如果beamletNumber爲0會怎麼樣?你得到無效索引。

+0

Duh,當然。謝謝!一個沒有看到樹木的案例! – 2010-12-21 07:40:34

1

at()拋出異常。如果索引超出範圍,則會拋出一個out_of_range異常。

檢查(beamletNumber/beamletNumber-1)是否對應於存在元素的向量中的索引。 at()檢查它並拋出異常。

類out_of_range的異常用於報告參數值不在預期的範圍內,例如在類似數組的集合或字符串中使用錯誤的索引時。

2

我的猜測是你正在傳遞beamletNumber == 0,然後將其作成(無符號)-1,換句話說就是一個非常大的數字。

在(largenumber)然後引發您使用兩個這個 - > beamlets.at(beamletNumber-1)和這 - > beamlets.at(beamletNumber)

0

。 (beamletNumber-1)表明你正在用基於1的索引處理矢量,而this-> beamlets.at(beamletNumber)建議基於0的索引。

基於1的索引this-> beamlets.at(beamletNumber)肯定會給出一個超出範圍的錯誤。

基於0的索引this-> beamlets.at(beamletNumber-1)肯定會給出一個超出範圍的錯誤。