0

我正在使用 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;
}

这是 normal 被重新定义和打印的地方。即使替换std::cout << *normal << std::endl;std::cout << normal->x << std::endl;作品并为我提供正确的数据,但在其他功能中却没有?我只是不明白。我很确定这很愚蠢(我希望如此)。提前致谢。

4

1 回答 1

4

If you have code similar to this:

// 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';
}

Then you are invoking undefined behavior. This is because the pointer you add in function foo is no longer valid, as it points to a local variable.

于 2012-08-04T12:54:48.830 回答