我正在使用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;
也可以正常工作,但是在其他函数中却没有?我只是不明白。我很确定这是愚蠢的(我希望如此)。提前谢谢。
答案 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
中添加的指针不再有效,因为它指向局部变量。