[英]c++ stl vector causing memory overflow?
我正在广泛使用stl向量来管理大数据数组的内存(de-)分配。 特别是,我正在从大量角度(180度,以2度为步长)生成解剖结构的透视投影,并对结果进行处理和分析。 结果用于定义放射治疗的辐射场。
看来,如果数组超过一定大小(> 3个解剖结构),则内存溢出。 特别是错误如下
抛出'std :: out_of_range'what()的实例后调用终止终止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-> isSet = true;” 注释掉所有行,无论结构的数量如何,错误都不会自行显现:是的,它可以与6一起使用! “ isSet”布尔值用于确定已设置了哪些对象,因此需要将哪些对象写出到数据文件中以进行进一步处理。
系统和软件:
gcc(SUSE Linux)4.4.1 [gcc-4_4-branch版本150839] SuSE 11.2 64位Intel Celsius,具有4个Xeon 2.66GHz CPU和4GB RAM Eclipse CDT(IDE)64位Build 20100218-1602
显然,您正在访问容器外部的元素。 从这段代码中无法确定索引是否正确,请在调试器中遍历这段代码,您将看到。 可疑的部分: this->beamlets.at(beamletNumber-1).isOpen()
如果beamletNumber为0,该怎么办? 您得到无效的索引。
我的猜测是您要传递beamletNumber == 0,然后将其设为(无符号)-1,或者换句话说,是一个非常大的数字。
at(largenumber)然后抛出
at()引发异常。 如果索引超出范围,则会引发out_of_range异常。
检查(beamletNumber / beamletNumber-1)是否对应于元素存在的向量中的索引。 at()检查它并引发异常。
out_of_range类的异常用于报告参数值不在预期范围内,例如在类似数组的集合或字符串中使用了错误的索引时。
您同时使用this-> beamlets.at(beamletNumber-1)和this-> beamlets.at(beamletNumber)。
this-> beamlets.at(beamletNumber-1)建议您使用基于1的索引处理向量,而this-> beamlets.at(beamletNumber)建议使用基于0的索引。
使用基于1的索引时,this-> beamlets.at(beamletNumber)肯定会给出超出范围的错误。
使用从0开始的索引,this-> beamlets.at(beamletNumber-1)肯定会给出超出范围的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.