尝试从自己的类访问公共变量时奇怪的SIGSEGV

时间:2012-08-04 12:46:01

标签: c++ opengl sigsegv

我正在使用OpenGL编写程序,但我遇到了一个问题。我有一个名为“Quad”的类,导致问题的两个变量是公共地图和公共Vector3(这是另一个类)。以下是Quad.h中定义的两个变量:

std::map<unsigned int, Vector3*> vertexes;
Vector3* normal;
在Quad构造函数中启动了“正常”(我认为就是这个词),如下所示:

normal = new Vector3(0,0,0);

地图就像这样添加:

vertexes[0] = &vertex;

vertex是一个简单的Vector3,地图接受指向Vector3的指针,所以我不得不像那样引用它。

我可以通过另一个函数打印出Vector3的正确值但由于某种原因我在这里得到了一个分段错误:

void Quad::draw()
{
    glNormal3f(normal->x, normal->y, normal->z);

    for (std::map<unsigned int, Vector3*>::iterator i = this->vertexes.begin(); i !=   this->vertexes.end(); ++i) {
        glVertex3f(i->second->x, i->second->y, i->second->z);
    }
}

我知道它是由公共变量引起的,因为如果我注释掉方法的内容,就不会发生错误。 cout << normal->x << endl;也导致错误,cout << "Hello World!" << endl;没有。但是这个函数与此之间有什么区别;

void Quad::calculateNormal()
{
    Vector3 tmp = *vertexes[0];
    tmp = tmp.getFaceNormal(*vertexes[1], *vertexes[2]);
    normal = &tmp;
    std::cout << *normal << std::endl;
}

这是重新定义和打印法线的地方。即使用std::cout << *normal << std::endl;替换std::cout << normal->x << std::endl;也可以正常工作,但是在其他函数中却没有?我只是不明白。我很确定这是愚蠢的(我希望如此)。提前谢谢。

1 个答案:

答案 0 :(得分:4)

如果你有类似的代码:

// Global map of vertices
std::map<unsigned int, Vector3*> vertexes;

void foo()
{
    Vector3 vertex;
    vertexes[0] = &vertex;
}

int main()
{
    foo();
    std::cout << vertexes[0]->x << '\n';
}

然后您正在调用未定义的行为。这是因为您在函数foo中添加的指针不再有效,因为它指向局部变量。