2013-12-20 2 views
4

Это менее мольба о помощи в решении проблемы и еще вопрос о чем-то особенном, обнаруженном после решения проблемы. Я работал над своей игрой OpenGL для начинающих и пытался написать дружественный файл OOP. Все данные vbo хранились в классе модели, где он был загружен и буферизирован в конструкторе.Конструктор, вызванный в неподходящее время

Значительно упрощенная структура этого из магистрали будет выглядеть примерно так:

int main(){ 
    vector <Model> Models; 

    Graphics.GLInit(); 

    Models.push_back(Model(vertices,texcoords,36,0)); 

    Graphics.EnableAttributePointers(); 

    main loop 
    { 
     Graphics.draw(Models,Textures,Entities); 
    } 
    return 0; 
} 

Конструктор выглядел как:

Model::Model(vector <vec3> &vertices,vector <vec2> &texcoords,int NumVertices,int StartVertex) 
{ 
    iNumVertices=NumVertices; 
    iStartVertex=StartVertex; 

    Vertices=vertices; 
    Texcoords=texcoords; 

    glGenBuffers(1,&vboVertex); 
    glGenBuffers(1,&vboTexcoord); 
    glBindBuffer(GL_ARRAY_BUFFER,vboVertex); 
    glBufferData(GL_ARRAY_BUFFER,Vertices.size()*12,Vertices.data(),GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER,vboTexcoord); 
    glBufferData(GL_ARRAY_BUFFER,TexCoord.size()*8,TexCoord.data(),GL_STATIC_DRAW); 
} 

После вызова glDrawArrays в функции рисования ошибки сегментации будет происходить:

0xC0000005 cannot access 0x00000000 yadda yadda. 

Так что я проверил все бесчисленное количество времени чтобы убедиться, что все это имеет смысл. В конце концов я разорвал программу, сделав более простую версию, в которой тот же самый точный код используется без класса модели. Это сработало хорошо. Выяснив, что что-то не так с классом Model, я в конечном итоге поместил буферный код в отдельную функцию, которая будет вызываться непосредственно после конструктора. Это фиксировало это.

В любом случае, все это ставит вопрос о том, почему конструктор, казалось бы, был вызван из последовательности; перед кодом GLInit. Это или есть некоторые поведенческие причуды конструкторов, о которых я не знаю, в которых конечный автомат OpenGL не может быть соответствующим образом модифицирован ими по какой-то причудливой причине. Мои знания о C++ - это только уровень свободного времени для свободного времени, так что я пропущу что-то очевидное здесь?

+0

Где находится 'Models.push_back (Model (vertices, texcoords, 36,0));' called? Согласно вашему коду он находится вне любой области, поэтому он не будет компилироваться. – Jack

+0

Весь этот код выполняется в основном. «значительно упрощенная структура этого от main ...« В любом случае, отредактировал это, чтобы быть более ясным. –

+0

Можете ли вы опубликовать SSCCE? –

ответ

5

Я имею в виду, так как вы создаете вектор модели, следующий код

Models.push_back(Model(vertices,texcoords,36,0));

фактически делает копию (конструктор копирования будет называться) выталкивает копию в вектор. Затем оригинал удаляется.

Было бы интересно увидеть фактические данные членов класса Model, а также то, что является типом данных «vec3» и «vec2»?

Можно ли также увидеть функцию деструктора?

+0

Похоже, что Вершины и Texcoords являются членами данных класса Model и имеют векторный тип.Было бы неплохо увидеть деструктор и данные участников соответствующих классов. Во всяком случае, я только предполагаю, что произошло двойное удаление. Я отредактирую ответ, чтобы удалить двойное удаление. – anonymous

+0

@Purrfection: Даже если это не так, деструктор может вызывать 'glDeleteBuffers (...)'. Хотя копия в 'std :: vector' блаженно не осознает, что хранилище данных OpenGL, для которого его указатели массива вершин больше не существует. Определенно нужно видеть dtor в этом случае. –

+0

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

Смежные вопросы