这是一个c ++问题。
我正在开发一个OpenGL项目。写了一个简单的OBJ加载器。我有一个名为Mesh的课程。通过获取名为monkey
的对象指针Mesh* monkey;
并调用函数:
load_obj("Monkey.obj", monkey);
我想从文件中读取并将其放在猴子顶点中。 但是在运行它时会给我一个未处理的异常:当想要在以下位置推回向量时读取违规:
mesh->vertices.push_back(v);
我测试了一个局部矢量虚拟但它成功地推回了。我不知道为什么它不能推送到对象指针向量?
这是网格标题
include[...]
using namespace std;
class Mesh {
private:
GLuint vbo_vertices, vbo_normals, ibo_elements;
public:
vector <glm::vec4> vertices;
vector <glm::vec3> normals;
vector <GLushort> elements;
glm::mat4 object2world;
Mesh() : vertices(1), normals(1), elements(3), object2world(glm::mat4(1)) {}
~Mesh(void){} ;
void Mesh::draw(void) ;
};
这是obj-loader.cpp的相对部分
void load_obj(const char* filename, Mesh* mesh) {
ifstream in(filename, ios::in);
if (!in) { cerr << "Cannot open " << filename << endl; exit(1); }
vector<int> nb_seen;
vector<glm::vec4> dummy;
string line;
while (getline(in, line)) {
if (line.substr(0,2) == "v ") {
istringstream s(line.substr(2));
glm::vec4 v; s >> v.x; s >> v.y; s >> v.z; v.w = 1.0;
dummy.push_back(v);
mesh->vertices.push_back(v);
}
任何帮助将不胜感激! 你困惑的朋友!
答案 0 :(得分:1)
您必须为Mesh
之前打电话
load_obj("Monkey.obj", monkey);
答案 1 :(得分:0)
mesh
是一个未初始化的指针,您正在使用mesh->vertices
。此时你已经有了未定义的行为。您可能需要mesh
指向一个对象。
答案 2 :(得分:0)
从您发布的代码片段中,您似乎没有实际分配网格对象。像这样声明指针:
Mesh* monkey;
不初始化指针或分配任何内存,因此其值未定义。这就是加载代码崩溃的原因。因为网格指针无效,并指向一些垃圾内存。
它应该更像是:
Mesh* monkey = new Mesh();
然后至少你会有一个有效的指针,你可以在加载程序代码中合法地引用它。