ポインターのベクトルと、C++ に付属するイテレーターを使用しています。私が最初に書いた方法では seg fnault が発生しますが、一見些細な変更で、未使用の変数を宣言して初期化すると、seg fault がなくなります。誰かが理由を知っていますか?
障害をセグメント化するコードは次のとおりです。正常に実行される最後の行は 8 行目 (printf ステートメントで検出) であり、4 行目のコメントを外して segfault を取り除きます。
1 Intersect RayTracer::closestShape(Ray r){
2 vector<Shape *>::iterator itStart = scene.getShapes().begin();
3 vector<Shape *>::iterator itEnd = scene.getShapes().end();
4 //vector<Shape *> sceneShapes = scene.getShapes(); This is the unused line that will cause the code to run successfully if I uncomment it.
5 Intersect closest = Intersect();
6 for(;itStart != itEnd; itStart++){
7 Intersect currentIntersect = (*itStart)->intersect(r);
8 if(currentIntersect.isHit()){
9 if(currentIntersect.getT() < closest.getT()){
10 closest = currentIntersect;
}
}
}
return closest;
}
そして、これがもはやセグメンテーション違反ではない作業バージョンです:
1 Intersect RayTracer::closestShape(Ray r){
2 vector<Shape *> sceneShapes = scene.getShapes();
3 vector<Shape *>::iterator itStart = sceneShapes.begin();
4 vector<Shape *>::iterator itEnd = sceneShapes.end();
5 Intersect closest = Intersect();
6 for(;itStart != itEnd; itStart++){
7 Intersect currentIntersect = (*itStart)->intersect(r);
8 if(currentIntersect.isHit()){
9 if(currentIntersect.getT() < closest.getT()){
10 closest = currentIntersect;
}
}
}
return closest;
}
誰かがなぜこれが起こっているのかを明確にすることができれば、それは大歓迎です! 問題を明確にするために追加できるものがあれば教えてください。