访问用于对象的向量时读取违规

时间:2013-12-28 13:08:09

标签: c++ class pointers vector unhandled-exception

这是一个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);
    } 

任何帮助将不胜感激! 你困惑的朋友!

3 个答案:

答案 0 :(得分:1)

您必须为Mesh

分配内存

之前打电话

load_obj("Monkey.obj", monkey);

答案 1 :(得分:0)

mesh是一个未初始化的指针,您正在使用mesh->vertices。此时你已经有了未定义的行为。您可能需要mesh指向一个对象。

答案 2 :(得分:0)

从您发布的代码片段中,您似乎没有实际分配网格对象。像这样声明指针:

Mesh* monkey;

不初始化指针或分配任何内存,因此其值未定义。这就是加载代码崩溃的原因。因为网格指针无效,并指向一些垃圾内存。

它应该更像是:

Mesh* monkey = new Mesh();

然后至少你会有一个有效的指针,你可以在加载程序代码中合法地引用它。