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