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