矢量重置(清空)

时间:2018-03-25 04:12:59

标签: c++ pointers vector scope undefined-behavior

长话短说明我有一个三维对象数组,每个对象都有指向数组中相邻对象的指针,并且由于某种原因,在初始化之后,这些指针向量在下次请求数据时为空。

我尝试在细分的多维数据集中表示顶点。每个节点都是这样表示的类:

#include <glm/glm.hpp>

class Vertex {
public:
    glm::vec3 position;
    vector<Vertex*> DiagNeighbours;
    vector<Vertex*> DirectNeighbours;
    vector<Vertex*> ExtNeighbours;

    Vertex(float x, float y, float z) : position(glm::vec3(x, y, z)) { }
};

为了节省内存成本,我将指针存储到所有邻居。它的诊断邻居,它的直接邻居,以及它的扩展邻居(两个节点之间的直接邻居)。

我有另一个代表我建立的场景的类。它存储所有立方体顶点,初始化它们,并最终操纵它们的数据。它设置为这样(它有点长且重复,所以在第二次整个数组遍历后可以跳过它):

#include "Vertex.h"

class Scene {
    Vertex vertices[8][8][8];

public: 
    Scene() {
        for (int z = 0; z < 8; z++) {
            for (int y = 0; y < 8; y++) {
                for (int x = 0; x < 8; x++) {
                    vertices[z][y][x] = Vertex(glm::vec3(x, y, z)*cubeScale);
                }
            }
        }

        for (int z = 0; z < 8; z++) {
            for (int y = 0; y < 8; y++) {
                for (int x = 0; x < 8; x++) {
                    if(x != 7)
                        vertices[z][y][x].DirectNeighbours.push_back(&vertices[z][y][x + 1]);
                    if(x != 0)
                        vertices[z][y][x].DirectNeighbours.push_back(&vertices[z][y][x - 1]);
                    if(y != 7)
                        vertices[z][y][x].DirectNeighbours.push_back(&vertices[z][y + 1][x]);
                    if(y != 0)
                        vertices[z][y][x].DirectNeighbours.push_back(&vertices[z][y - 1][x]);
                    if(z != 7)
                        vertices[z][y][x].DirectNeighbours.push_back(&vertices[z + 1][y][x]);
                    if(z != 0)
                        vertices[z][y][x].DirectNeighbours.push_back(&vertices[z - 1][y][x]);
                }
            }
        }

        for (int z = 0; z < 8; z++) {
            for (int y = 0; y < 8; y++) {
                for (int x = 0; x < 8; x++) {
                    if (y != 7) {
                        if(x != 7)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z][y + 1][x + 1]);
                        if(x != 0)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z][y + 1][x - 1]);
                    }
                    if (y != 0) {
                        if (x != 7)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z][y - 1][x + 1]);
                        if (x != 0)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z][y - 1][x - 1]);
                    }
                    if (z != 7) {
                        if (x != 7)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z + 1][y][x + 1]);
                        if (x != 0)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z + 1][y][x - 1]);
                    }
                    if (z != 0) {
                        if (x != 7)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z - 1][y][x + 1]);
                        if (x != 0)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z - 1][y][x - 1]);
                    }
                    if (z != 7) {
                        if (y != 7)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z + 1][y + 1][x]);
                        if (y != 0)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z + 1][y - 1][x]);
                    }
                    if (z != 0) {
                        if (y != 7)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z - 1][y + 1][x]);
                        if (y != 0)
                            vertices[z][y][x].DiagNeighbours.push_back(&vertices[z - 1][y - 1][x]);
                    }
                }
            }
        }

        for (int z = 0; z < 8; z++) {
            for (int y = 0; y < 8; y++) {
                for (int x = 0; x < 8; x++) {
                    if (x != 6)
                        vertices[z][y][x].ExtNeighbours.push_back(&vertices[z][y][x + 2]);
                    if (x != 1)
                        vertices[z][y][x].ExtNeighbours.push_back(&vertices[z][y][x - 2]);
                    if (y != 6)
                        vertices[z][y][x].ExtNeighbours.push_back(&vertices[z][y + 2][x]);
                    if (y != 1)
                        vertices[z][y][x].ExtNeighbours.push_back(&vertices[z][y - 2][x]);
                    if (z != 6)
                        vertices[z][y][x].ExtNeighbours.push_back(&vertices[z + 2][y][x]);
                    if (z != 1)
                        vertices[z][y][x].ExtNeighbours.push_back(&vertices[z - 2][y][x]);
                }
            }
        }
    }

    //By the time we enter this function the vectors are empty
    void Simulate() {
        for (int z = 0; z < 8; z++) {
            for (int y = 0; y < 8; y++) {
                for (int x = 0; x < 8; x++) {
                    masses[z][y][x]->velocity += ProcessVelocity(*(masses[z][y][x]));
                    masses[z][y][x]->position += masses[z][y][x]->velocity * deltaTime;
                }
            }
        }
    }
};

截至此构造函数的最后一行,所有内容都已填充。正如我所料,所有三个向量都被初始化和填充,分别为12,6和6。现在的问题在于,当我离开这个构造函数时,我已经发送了很多努力填充的所有指针向量都被清空了。最奇怪的部分是位置变量仍然设置,所以我知道对象仍然是相同的,它只是已经消失的矢量数据。

事先我很抱歉,如果之前已经问过这个问题(我老老实实地尝试过使用stackoverflow来解决这个问题,主要是寻找一个矢量可能会自行清空的原因),而且事实上我几乎可以肯定它我忽视了一些简单的事情,比如我没有看到的范围。提前感谢您的所有帮助。

更新信息

尝试帮助发现我在程序主函数中存储和访问场景的问题。

vector<Scene*> scenes;
unsigned int currentScene = 0;

int main() {
    scenes.push_back(&Scene());
    while(true) {
        scenes[currentScene]->Simulate()
    }
}

0 个答案:

没有答案