我的程序继续给出“[project] .exe已停止工作”错误。经过一些调试后的行
HitInfo hitInfo = (*it)->intersection(ray);
给了我Signal : SIGSEGV:Segmentation fault
之后(如果再次点击恢复)程序崩溃了。
我已经读过这个错误可能是由空指针引起的,试图访问只读内存并指向不再存在的东西。但我无法在我的案例中找到确切的问题。
我的代码如下
HitInfo Mesh::intersection(const Ray & ray){
HitInfo bestHitInfo(DBL_MAX);
for(std::vector<IFace*>::iterator it = faces.begin(); it != faces.end(); ++it) {
HitInfo hitInfo = (*it)->intersection(ray);
if(hitInfo.getT() < bestHitInfo.getT()){
bestHitInfo = hitInfo;
}
}
bestHitInfo.setHitMaterial(Material(mtrl));
return bestHitInfo;
}
函数intersection(ray)
永远不会在其各自的类中被访问,它只是在尝试传递该行代码时抛出错误。
intersection(const Ray & ray)
函数被多次继承,但由于它永远不会被访问,而不是父类或子类,我认为这不是问题。
任何关于为什么会抛出此错误或找到最佳错误方法的帮助都会很棒。
---- ---- EDIT
这是将FlatFaces添加到我的面向量的方法。 FlatFaces是IFace的子类。创建面部的逻辑是正确的,可能对问题没有用,但是为了确保这一点而添加了一切。
void Mesh::readFile(const std::string & filename){
std::ifstream inf(filename.c_str());
if (!inf) {
std::cout << "Mesh file " << filename << " could not be opened!\n";
exit(1);
}
int vertices, vectors, faces;
inf >> vertices >> vectors >> faces;
for(int n = 0; n < vertices; n++){
double a,b,c;
inf >> a >> b >> c;
verts.push_back(Point(a, b, c));
}
for(int n = 0; n < vectors; n++){
double x,y,z;
inf >> x >> y >> z;
norms.push_back(Vector(x, y, z));
}
for(int n = 0; n < faces; n++){
int a;
inf >> a;
std::vector<Point> facesVerts;
std::vector<Vector> faceNorms;
for(int n =0; n < a; n++){
double point;
inf >> point;
facesVerts.push_back(verts[point]);
}
for(int n = 0; n < a; n++){
double norm;
inf >> norm;
faceNorms.push_back(norms[norm]);
}
FlatFace face = FlatFace(&verts[facesVerts[0]], &verts[facesVerts[1]], &verts[facesVerts[2]], norms[faceNorms[0]]);
this->faces.push_back(&face);
}
答案 0 :(得分:2)
IJavaProject
将在堆栈上分配。您可以将堆栈中对象的地址添加到向量中。当您稍后迭代向量时,此地址不再有效,因为该对象不再在堆栈中。
您可以使用向量而不是共享指针(FlatFace face = FlatFace(&verts ...
)