我正在广泛使用stl向量来管理大数据数据的内存(de-)分配。特别是我从大量角度(180度2度步长)生成解剖结构的透视投影,处理和分析结果。结果用于定义放射治疗的辐射场。
似乎如果阵列超过一定大小(> 3个解剖结构),则存储器溢出。特别是错误如下
在抛出'std :: out_of_range'的实例后终止调用 what():vector :: _ M_range_check
这是使用at的结果,它执行边界检查,而不是更快的[]运算符。如果我有< = 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;
}
请注意,如果“this-&gt; isSet = true;”线条被注释掉,无论结构的数量如何,错误都不会显现出来:是的,它适用于6! “isSet”布尔值用于确定已设置哪些对象,因此需要将哪些对象写入数据文件以供进一步处理。
系统和软件:
gcc(SUSE Linux)4.4.1 [gcc-4_4-branch revision 150839] SuSE 11.2 64位 Intel Celsius采用4 Xeon 2.66GHz CPU和4GB RAM Eclipse CDT(IDE)64位Build 20100218-1602
答案 0 :(得分:2)
显然,您正在访问容器外部的元素。从这段代码中可以说,索引是否正确,在调试器中浏览这段代码,你会看到。可疑的样子:this->beamlets.at(beamletNumber-1).isOpen()
如果beamletNumber为0怎么办?你得到的索引无效。
答案 1 :(得分:2)
我的猜测是你传递的是beamletNumber == 0,然后是(无符号)-1,或者换句话说是非常大的数字。
at(largenumber)然后抛出
答案 2 :(得分:1)
at()抛出异常。如果索引超出范围,则会抛出out_of_range异常。
检查(beamletNumber / beamletNumber-1)是否与存在元素的向量中的索引相对应。 at()检查它并抛出异常。
类out_of_range的异常用于报告参数值不在预期范围内,例如在类似数组的集合或字符串中使用错误的索引时。
答案 3 :(得分:0)
你正在使用this-&gt; beamlets.at(beamletNumber-1)和this-&gt; beamlets.at(beamletNumber)。
this-&gt; beamlets.at(beamletNumber-1)建议您使用基于1的索引处理向量,而this-&gt; beamlets.at(beamletNumber)建议使用基于0的索引。
基于1的索引this-&gt; beamlets.at(beamletNumber)肯定会产生超出范围的错误。
基于0的索引this-&gt; beamlets.at(beamletNumber-1)肯定会产生超出范围的错误。