繁体   English   中英

c + + stl向量导致内存溢出?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM