c ++ stl vector导致内存溢出?

时间:2010-12-20 16:15:04

标签: c++ stl vector

我正在广泛使用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

4 个答案:

答案 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)肯定会产生超出范围的错误。