segfault при использовании sizeof (vector [0]) * vector-> size () - PullRequest
1 голос
/ 06 ноября 2011

С учетом фрагмента рабочего кода

    glBufferData(GL_ARRAY_BUFFER, vertices->size() * sizeof(glm::vec3), &vertices->front(), GL_STATIC_DRAW); // Set the size and data of our VBO and set it to STATIC_DRAW
    glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); // Set up our vertex attributes pointer


    glGenBuffers(1,&indexBufferId);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexBufferId);
    // We have to use &triangles.front() otherwise we get vector house keeping garbage
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, triangles->size() * sizeof(unsigned), &triangles->front(), GL_STATIC_DRAW); // Set the size and data of our VBO and set it to STATIC_DRAW
    glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); // Set up our vertex attributes pointer

В основном я отправляю данные в OpenGL, и, естественно, я должен указать, откуда и сколько копировать. После нескольких изменений типов в моих векторах я решил, что не хочу обновлять каждую ссылку на тип, и попробовал следующую строку.

 glBufferData(GL_ELEMENT_ARRAY_BUFFER, triangles->size() * sizeof(triangles[0]), &triangles->front(), GL_STATIC_DRAW); // Set the size and data of our VBO and set it to STATIC_DRAW

с использованием sizeof(triangles[0]) вместо sizeof(unsigned). Подсчет, эй, мой вектор напечатан, поэтому он должен иметь возможность определить тип элемента во время компиляции, поэтому мне не нужно сообщать это каждому рефакторингу.

Однако это не тот случай. Это единственное изменение вызывает ошибку по умолчанию, когда выполняется любая строка с соответствующим вектором.

Еще одна путаница (возникшая при попытке сжать мой код) использует

  glBufferData(GL_ELEMENT_ARRAY_BUFFER, triangles->size() * sizeof(unsigned), &triangles[0], GL_STATIC_DRAW); 

замена &triangles.front() на &triangles[0] вызывает тот же segfault. Я понял, что эти два утверждения должны быть равны.

Где мое недоразумение? Я думал, что заявления, которые являются segfaulting, были эквивалентны рабочим.

Ответы [ 2 ]

3 голосов
/ 06 ноября 2011

Поскольку вы используете vector-> size (), это означает, что vector должен быть указателем (если только вы не используете магию перегрузки операторов).

Несмотря на то что vector имеет оператор [], vector * []не будет вести себя так, как вы ожидаете.

#include <vector>
#include <iostream>

using std::vector;
using std::cout;
using std::endl;

int main() {
    vector<int>* x = new vector<int>();
    x->push_back(3);
    x->push_back(4);

    cout << sizeof(vector<int>*) << endl;
    cout << sizeof(x) << endl;
    cout << sizeof(vector<int>) << endl;
    cout << sizeof(*x) << endl;
    cout << sizeof(x[0]) << endl;
    cout << sizeof(int) << endl;
    cout << sizeof((*x)[0]) << endl;

    return 0;
}

На моем компьютере эта программа выводит следующее:

8
8
24
24
24
4
4

Другими словами, sizeof(vector[0]) даст вам размер vector, а не размер каждого элемента вектора.А поскольку расчет размера неверен, возможны проблемы с ошибками сегментации.

1 голос
/ 06 ноября 2011

Вы не показываете объявление triangles, но из того, как вы его используете, оно выглядит как std::vector<unsigned>* (обратите внимание на указатель).Учитывая это, оно должно быть:

sizeof( (*triangles)[0] )

и

&(*triangles)[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...