使用sizeof(vector [0])* vector-> size()时的段错误

时间:2011-11-05 20:31:50

标签: c++ opengl stl

给出工作代码段

    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]会导致相同的段错误。我理解这两个陈述应该是平等的。

我的误解在哪里?我认为segfaulting的陈述等同于工作陈述。

2 个答案:

答案 0 :(得分:3)

由于你使用的是vector-> size(),这意味着vector必须是一个指针(除非你使用了一些运算符重载魔法)。

虽然vector确实有operator [],但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 :(得分:1)

您不会显示triangles的声明,但是从您使用它的方式来看,似乎是std::vector<unsigned>*(请注意指针)。考虑到这一点,它应该是:

sizeof( (*triangles)[0] )

&(*triangles)[0]