Quantcast
Channel: Forum Pasja Informatyki - Najnowsze pytania bez odpowiedzi
Viewing all articles
Browse latest Browse all 21993

Dziwny crash przy dereferencji iteratorów

$
0
0

Program mi się crashuje w momencie w którym nie powinien. Co dziewniejsze - wcześniej się to działo tylko w binarce skompilowanej w trybie Debug albo odpalając pod debugerem. W Release wszystko działało (zamierzałem potem się tym zająć) - aż do dzisiaj. Teraz w Release też się sypie. Debuger twierdzi vector iterator not dereferencable. Kompiluje msvc. Pod gcc tego nie było, aczkolwiek gcc w ogóle nie kompilowałem do wersji (?) debug.

Kod:

   std::vector<float> xVec, yVec, zVec;
   auto comp = [](float& a, float& b)->bool { return a < b; };

   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(), comp);
   auto y = std::minmax_element(yVec.begin(), yVec.end(), comp);
   auto z = std::minmax_element(zVec.begin(), zVec.end(), comp);

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

Dla jasności:

  • To metoda obliczająca rozmiar (minimalne rozmiary prostopadłościanu w jaki można zmieścić model) modelu. 
  • Mesh::getMinMaxCoords wyszukuje wierzchołki najbardziej oddalone (w obie strony) na osiach x, y, z w obrębie mesha (jakby części modelu) i zwraca odpowiedni std::tuple.
  • m_size to glm::vec3. Zwykły wrapper na 3 floaty, nic szczególnego.

To tak, żeby kod był jasny, ale to nie ma związku z błędem. 

std::minmax_element wyszukuje w obrębie [first, last), więc nie tyka iteratora .end(). Vectory (w sensie kontenery ofc) istnieją w chwili dereferencji, więc nie rozumiem o co może chodzić. Dla pewności spróbowałem użyć minmax_element na .begin() ; .end() - 1 (chodzi mi o zakres) na wypadek gdyby microsoftowi sie coś pomyliło z implementacją i funkcja by szukała w [first, last], ale nic to nie dało - dokładnie to samo.

Jakieś pomysły o co może chodzić?

btw właśnie sobie uświadomiłem, że ta lambda jest niekonieczna, ale nieważne


Viewing all articles
Browse latest Browse all 21993

Trending Articles


Sprawdź z którą postacią z anime dzielisz urodziny


MDM - Muzyka Dla Miasta (2009)


Częstotliwość 3.722MHz


POSZUKIWANY TOMASZ SKOWRON-ANGLIA


Ciasto 3 Bit


Kasowanie inspekcji Hyundai ix35


Steel Division 2 SPOLSZCZENIE


SZCZOTKOWANIE TWARZY NA SUCHO


Potrzebuje schemat budowy silnika YX140


Musierowicz Małgorzata - Kwiat kalafiora [audiobook PL]