私は大規模なデータ配列のメモリ(非)割り当てを管理するために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
ご覧になり、ここに貼り付ける動作を再現する最小のテストアプリケーションを作成します。しかし、最も可能性の高い説明は、STLではなくコードに問題があることです。 – karlphillip
あなたの他の質問を確認し、いくつかの回答を受け入れる時間をかけてください! – karlphillip