2010-12-20 5 views
1

私は大規模なデータ配列のメモリ(非)割り当てを管理するためにstlベクターを幅広く使用しています。特に、私は解剖学的構造の透視投影を多数の角度(2度180度ステップ)から生成し、結果を処理し分析しています。結果は、放射線治療のための放射線場を定義するために使用される。メモリオーバーフローの原因となるC++のstlベクトル?

メモリがオーバーフローする特定のサイズ(> 3の解剖学的構造)を超える配列があると思われます。ベクター:: _ M_range_check

これは、境界チェックないで使用した結果、次のとおりです

のインスタンスが投げた後に呼び出さ終了「STDを:: out_of_range」 もの()を次のように具体的にエラーがあります、より速い[]演算子ではなく、 < = 3構造の場合、エラーは発生しません。

Iコード

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」ブール値は、どのオブジェクトが設定されているかを決定するために使用され、したがって、後で処理するためにどのオブジェクトをデータファイルに書き出す必要があるかを決定する。

システムとsodtware:

のgcc(SUSE Linux)の4.4.1 [GCC-4_4分岐リビジョン150839] 4つのXeonプロセッサ2.66GHzのCPUと4ギガバイトのRAM のEclipse CDT(IDEと のSuSE 11.2 64 インテル摂氏)64ビットビルド20100218-1602

+0

ご覧になり、ここに貼り付ける動作を再現する最小のテストアプリケーションを作成します。しかし、最も可能性の高い説明は、STLではなくコードに問題があることです。 – karlphillip

+0

あなたの他の質問を確認し、いくつかの回答を受け入れる時間をかけてください! – karlphillip

答えて

2

明らかに、コンテナの外側の要素にアクセスしています。このコードから、索引が正しいかどうかは言えませんが、デバッガでこのコードを調べると表示されます。不審な部分:this->beamlets.at(beamletNumber-1).isOpen() beamletNumberが0の場合はどうなりますか?あなたは無効なインデックスを取得します。

+0

もちろん、Duh。ありがとう!木の木が見えない場合! –

1

at()が例外をスローします。インデックスが範囲外の場合、out_of_range例外がスローされます。

(beamletNumber/beamletNumber-1)が、要素が存在するベクトルのインデックスに対応しているかどうかを確認します。 at()はそれをチェックし、例外をスローします。

out_of_rangeクラスの例外は、配列のようなコレクションまたは文字列で間違ったインデックスが使用された場合など、引数の値が期待される範囲にないことを報告するために使用されます。

2

私は、beamletNumber == 0を渡していて、(符号なし)-1、つまり非常に大きな数値を渡していると思います。 (largenumber)で

は、あなたがthis-> beamlets.at(beamletNumber-1)およびthis-> beamlets.at(beamletNumber)の両方を使用している

0

をスローします。これは、1から始まるインデックスでvectorを扱っていることを示しています。この間、> beamslets.at(beamletNumber)は、0から始まるインデックスを示しています。

1ベースのインデックスthis-> beamslets.at(beamletNumber)は、範囲外のエラーを表示します。

0ベースのインデックスthis-> beamslets.at(beamletNumber-1)は、範囲外のエラーを確実に返します。

関連する問題