2016-09-05 2 views
1

Я следую инструкциям по youtube относительно opengl (библиотека графического программирования). Я создал классы, называемые вершинами, ShapeData и ShapeGenerator. Общая идея заключается в том, что я создаю код, в котором будут храниться данные для любого типа формы, который я решаю придумать и хочу отображать на экране. Проблема заключается в том, что моя программа, похоже, сбой, как только первая «delete []» попадает в ShapeData.h в функцию cleanup(). Вот соответствующий код:удалить массив в C++, вызвав ошибку программы

Vertex.h

#pragma once 
#include "GLM/glm.hpp" 

class Vertex 
{ 
public: 
    Vertex(); 
    Vertex(glm::vec3 thePosition, glm::vec3 theColor); 
    glm::vec3 position; 
    glm::vec3 color; 
}; 

Vertex.cpp

#include "Vertex.h" 

Vertex::Vertex() 
{} 

Vertex::Vertex(glm::vec3 thePosition, glm::vec3 theColor) : 
    position(thePosition), 
    color(theColor) 
{ 
} 

ShapeData.h

#pragma once 
#include "Vertex.h" 
#include "GL/glew.h" 

struct ShapeData 
{ 
    ShapeData() : 
     verticies(0), numberOfVerts(0), 
     indicies(0), numberOfIndicies(0) 
    {} 
    Vertex* verticies; 
    GLuint numberOfVerts; 
    GLushort* indicies; 
    GLuint numberOfIndicies; 
    GLsizeiptr VertexBufferSize() const 
    { 
     return numberOfVerts * sizeof(Vertex); 
    } 
    GLsizeiptr IndexBufferSize() const 
    { 
     return numberOfIndicies * sizeof(GLushort); 
    } 
    void CleanUp() 
    { 
     delete[] verticies; 
     delete[] indicies; 
     verticies = 0; 
     indicies = 0; 
     numberOfIndicies = 0; 
     numberOfVerts = 0; 
    } 
}; 

ShapeGenerator.cpp

#include "ShapeGenerator.h" 


ShapeData ShapeGenerator::MakeTriangle() 
{ 
    Vertex triangle[] = { 
     Vertex(glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(1.0f, 0.0f, 0.0f)), 
     Vertex(glm::vec3(-1.0f, -1.0f, 0.0f), glm::vec3(1.0f, 0.0f, 0.0f)), 
     Vertex(glm::vec3(1.0f, -1.0f, 0.0f), glm::vec3(1.0f, 0.0f, 0.0f)) 
    }; 
    ShapeData shapeData; 

    shapeData.numberOfVerts = sizeof(triangle)/sizeof(*triangle); 
    shapeData.verticies = new Vertex[shapeData.numberOfVerts]; 
    memcpy(shapeData.verticies, triangle, sizeof(triangle)); 
    shapeData.verticies = triangle; 

    GLushort indicies[] = { 0,1,2 }; 
    shapeData.numberOfIndicies = sizeof(indicies)/sizeof(*indicies); 
    shapeData.indicies = new GLushort[shapeData.numberOfIndicies]; 
    memcpy(shapeData.indicies, indicies, sizeof(indicies)); 

    return shapeData; 
} 

Я пытаюсь создать треугольник, и все работает нормально, не выполняя функцию cleanup() внутри main. Вот та часть, где я звоню Cleanup() в основной:

main.cpp

ShapeData triangle = ShapeGenerator::MakeTriangle(); 

    GLuint bufferID; 
    glGenBuffers(1, &bufferID); 
    glBindBuffer(GL_ARRAY_BUFFER, bufferID); 
    glBufferData(GL_ARRAY_BUFFER, triangle.VertexBufferSize(), triangle.verticies, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, 0); 
    glEnableVertexAttribArray(1); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 6, (char*)(sizeof(float) * 3)); 

    GLuint indexBufferID; 
    glGenBuffers(1, &indexBufferID); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, triangle.IndexBufferSize(),triangle.indicies, GL_STATIC_DRAW); 

    triangle.CleanUp(); 
+1

http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Biffen

+4

Я вижу сырые указатели и 'memcpy' вместо векторов и назначений. –

+0

Что такое 'about opengl (библиотека графического программирования)' Я никогда не слышал об этом -_- – KostasRim

ответ

3

Вы заменяете новый [] 'd указатель здесь. Это вызывает сбой, потому что треугольник не является новым [] 'd.

shapeData.verticies = new Vertex[shapeData.numberOfVerts]; 
memcpy(shapeData.verticies, triangle, sizeof(triangle)); 
shapeData.verticies = triangle;