下面是我目前可以使用的程序布局的简单标记。它用于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的属性设置为我在该方法中创建的某个对象的指针。什么都没有归还。
答案 0 :(得分:1)
该行
Mesh myMesh;
在init()
和
mp = &myMesh;
创建指向该局部变量的指针。但是,当您离开init()
时,此局部变量不再存在。因此,访问它会导致未定义的行为。
简单的解决方案是将myMesh
声明为Program
的成员变量,或者使用Mesh* myMesh = new Mesh()
在堆上实例化它(并在关闭时将其销毁)。