C ++分段错误

时间:2015-08-08 18:24:09

标签: c++

我的程序继续给出“[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);
    }

1 个答案:

答案 0 :(得分:2)

IJavaProject

将在堆栈上分配。您可以将堆栈中对象的地址添加到向量中。当您稍后迭代向量时,此地址不再有效,因为该对象不再在堆栈中。

您可以使用向量而不是共享指针(FlatFace face = FlatFace(&verts ...