使用std :: minmax_element进行奇怪的崩溃 - vector iterator not dereferencable

时间:2016-09-09 15:23:26

标签: c++ c++11 vector iterator dereference

我的应用程序在不应该崩溃的时刻崩溃。还有什么 - 昨天它只是在调试模式下编译的exe或在调试器下运行时崩溃。发布版运行良好。现在它也在Release中崩溃,但代码中没有任何变化。我正在使用MSVC进行编译。当我与GCC合作时,我记得它没有崩溃(相同的代码),但是我没有编译到Debug。

代码:

   std::vector<float> xVec, yVec, zVec;


   for(auto& mesh : m_meshes)
   {
      std::pair<float, float> minMaxX, minMaxY, minMaxZ;
      std::tie(minMaxX, minMaxY, minMaxZ) = mesh.getMinMaxCoords();

      xVec.push_back(minMaxX.first);
      xVec.push_back(minMaxX.second);

      yVec.push_back(minMaxY.first);
      yVec.push_back(minMaxY.second);

      zVec.push_back(minMaxZ.first);
      zVec.push_back(minMaxZ.second);
   }

   auto x = std::minmax_element(xVec.begin(), xVec.end());
   auto y = std::minmax_element(yVec.begin(), yVec.end());
   auto z = std::minmax_element(zVec.begin(), zVec.end());

   m_size = {
               *x.second - *x.first,
               *y.second - *y.first,
               *z.second - *z.first
            }; 

使代码清晰:

  1. 是计算模型的尺寸(能够适合模型的最小长方体)的方法的主体。
  2. Mesh::getMinMaxCoords在x,y和z轴(两个方向)上找到最远的顶点,并返回足够的std::tuple。 (我希望你明白我的意思,但这并不重要)
  3. m_size是glm :: vec3。只是一个简单的3个花车包装。
  4. 只是为了让代码清楚,但它与问题无关(我想是这样)。

    std :: minmax_element在范围[first,last]中搜索,因此它不会触及.end()迭代器。向量(我的意思是竞争者 - xVecyVeczVec)在解除引用时仍然存在,所以我不会得到可能出错的内容。为了确保我尝试在范围.begin()上调用minmax_element; (.end() - 1)以防微软在实现中出错并且函数在[first,last]中搜索但没有任何改变。

    任何可能导致崩溃的想法?

0 个答案:

没有答案