1

我正在编写的一些代码有问题;每当我删除我动态分配的数组时,我的程序就会崩溃并抛出一个错误,上面写着“_BLOCK_TYPE_IS_VALID (phead-nblockuse)”。

class Shape 
{
protected:
    unsigned int numberOfVertices;
    glm::vec2 *vertexCoords; //openGL 2d vector..

public:
    Shape();
    virtual ~Shape() {}
}

class Rectangle : public Shape
{
protected:
    unsigned int width;
    unsigned int height;

    void initVertexCoords();

public:
    Rectangle();
    Rectangle( unsigned int tempWidth, unsigned int tempHeight );
    ~Rectangle();
}

Rectangle::Rectangle( unsigned int tempWidth, unsigned int tempHeight )
{
    width = tempWidth;
    height = tempHeight;

    initVertexCoords();
}

void Rectangle::initVertexCoords()
{
    numberOfVertices = 4;

    vertexCoords = new glm::vec2[ numberOfVertices ];    //Dynamic allocation..

    vertexCoords[0].x = -width * 0.5f;
    vertexCoords[0].y = -height * 0.5f;

    vertexCoords[1].x = -width * 0.5f;
    vertexCoords[1].y = height * 0.5f;

    vertexCoords[2].x = width * 0.5f;
    vertexCoords[2].y = height * 0.5f;

    vertexCoords[3].x = width * 0.5f;
    vertexCoords[3].y = -height * 0.5f;
}

Rectangle::~Rectangle()
{
    delete [] vertexCoords; //freeing of dynamically allocated array..
    //program doesn't crash when this destructor is empty!
}

因此,在 Shape(父类)中创建了一个指向 2D 向量的指针,子类 Rectangle 的构造函数动态分配一个数组并将第一个元素的地址存储在该指针中。

但是,当我尝试在 Rectangle 的析构函数中删除该数组时,程序会引发运行时默认异常 [_BLOCK_TYPE_IS_VALID (phead-nblockuse)]。当我从析构函数中删除删除命令时,程序编译并运行良好。但是,我担心内存泄漏的可能性;我想学习如何正确地动态分配对象和对象数组。我已经查找了大约 2 个小时,但我仍然无法找到解决方案。

我假设对“new”的调用会在堆上动态分配一定数量的内存,并且最终需要通过调用“delete”来释放该内存。理所当然的是,在类构造函数中分配的东西(或者,在这种情况下,在构造函数内部调用的类方法中)应该在类析构函数中释放。

我对 C++ 和一般编程仍然很陌生,所以我可能忽略了一些非常简单的东西。如果我的代码中有明显的错误会导致这种错误,请告诉我。

4

0 回答 0