包含索引的向量的对象指针

时间:2017-09-08 20:35:20

标签: c++ pointers

下面是我目前可以使用的程序布局的简单标记。它用于OpenGL。基本上我想在将网格发送到主循环之前初始化网格。我可以用

做到这一点
vector<Mesh> MeshContainer;

一旦我初始化它,将其推入MeshContainer,然后在主循环中调用它。我宁愿能够在Program结构中定义一个指针,在init()函数中创建网格,然后存储指针然后使用指针。

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;

struct Mesh {

    vector<float> MeshVector;

};

struct Program {

    bool shouldClose = false;
    // Store the mesh as a pointer after we do some initialization.
    Mesh *mp;

    // Initialize is ran before the program and initializes before the loop begins.
    void init() {

        // Create the sudo-mesh.
        Mesh myMesh;

        // Give it some values. 9 in total.
        myMesh.MeshVector = {
            1.0f, -1.0f, 1.0f,
            -1.0f, 1.0f, -1.0f,
            1.0f, -1.0f, 1.0f,
        };

        mp = &myMesh;

    }

    // This is ran in the loop.
    void run() {
        cout << mp->MeshVector[0] << endl;
    }

    void loop() {

        // Simulates layout of OpenGL application.
        init();

        // Program loop.
        while (!shouldClose) {
            // This simulates the draw loop.
            run();
        }
    }

};

int main() {

    // Create the program.
    Program app;
    app.loop();

    return 0;
}

然而,即使在我写的这个简单的应用程序中,它也给了我“向量下标超出范围”。现在这样做是毫无意义的(双关语)因为我最终会编写一个内存管理类来绕过所有这些喧嚣,但是当我学习时,我希望这是我快速而肮脏的解决方案。

我到底错在了什么? 我应该能够做到:

cout << mp->MeshVector[0] << endl;

得到预期的结果?

编辑:

我的问题不涉及返回指针的函数。它只是将struct的属性设置为我在该方法中创建的某个对象的指针。什么都没有归还。

1 个答案:

答案 0 :(得分:1)

该行

Mesh myMesh;

init()

中创建一个局部变量
mp = &myMesh;

创建指向该局部变量的指针。但是,当您离开init()时,此局部变量不再存在。因此,访问它会导致未定义的行为。

简单的解决方案是将myMesh声明为Program的成员变量,或者使用Mesh* myMesh = new Mesh()在堆上实例化它(并在关闭时将其销毁)。