2016-09-05 9 views
1

opengl (그래픽 프로그래밍 라이브러리)과 관련된 YouTube 튜토리얼을 따르고 있습니다. 저는 vertex, ShapeData, ShapeGenerator라는 클래스를 만들었습니다. 전반적인 아이디어는 어떤 유형의 도형에 대한 데이터를 보유 할 코드를 작성하는 것입니다.이 코드는 화면에 표시하고 싶습니다. 문제는 cleanup() 함수에서 ShapeData.h 내 첫 번째 "delete []"가 히트되면 내 프로그램이 충돌하는 것입니다.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; 
} 
다음은 관련 코드입니다

삼각형을 만들려고하는데 main 내에서 cleanup() 함수를 실행하지 않고도 모든 것이 잘 작동합니다.

MAIN.CPP 현재 새로운 [] 'D 포인터를 교체

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

'OpenGL (그래픽 프로그래밍 라이브러리)에 대해'나는 무엇을 들어 보지 못했습니다 -_- – KostasRim

답변

3

: 여기 메인에 정리()를 호출하고있어 부분이다. 삼각형이 새로운 것이 아니기 때문에 충돌이 발생합니다.

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