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

delete array in C++ causing program crash

本文关键字:程序 崩溃 数组 c++ 删除      更新时间:2023-10-16

我跟随一个关于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.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();

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

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