нарушение чтения при доступе к вектору для объекта

0

это вопрос c++.

Я работаю над проектом OpenGL. написал простой загрузчик OBJ. У меня есть класс под названием Mesh. Получив указатель объекта под названием обезьяна

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);
    } 

любая помощь будет оценена! ваш смущенный друг!

Теги:
class
pointers
vector
unhandled-exception

3 ответа

0
Лучший ответ

Из фрагментов кода, которые вы опубликовали, кажется, что вы фактически не выделили объект mesh. Объявление указателя следующим образом:

Mesh* monkey;

не инициализирует указатель или не выделяет любую память, поэтому его значение не определено. Вот почему код загрузки сбой. Потому что указатель сетки недействителен и указывает на некоторую память мусора.

Это должно быть нечто большее:

Mesh* monkey = new Mesh();

Тогда, по крайней мере, у вас будет действительный указатель, который затем можно законно ссылаться на код загрузчика.

  • 0
    хех, теперь я помню. у нас был курс C ++ в прошлом году, вы знаете! : - / Многие TNX Гавинб!
1

Вам необходимо будет выделить память для Mesh

перед вызовом

load_obj("Monkey.obj", monkey);
0

mesh - неинициализированный указатель, на котором вы используете mesh->vertices. На данный момент вы получили неопределенное поведение. Вероятно, вам нужна точка mesh для объекта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню