在C ++中删除数组导致程序崩溃

时间:2016-09-05 15:22:21

标签: c++ pointers opengl graphics delete-operator

我正在关注有关opengl(图形编程库)的youtube教程。我创建了名为vertex,ShapeData和ShapeGenerator的类。总体思路是我正在创建代码,该代码将保存我决定想出的任何形状的数据,并希望显示在屏幕上。问题是我的程序似乎在cleanup()函数中的ShapeData.h中遇到第一个“delete []”时崩溃。以下是相关代码:

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中调用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 个答案:

答案 0 :(得分:3)

您正在此处替换新的[]' d指针。这会导致崩溃,因为三角形不是新的[]' d。

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