在析构函数中删除动态分配的数组导致错误

时间:2013-06-02 07:17:42

标签: c++ arrays dynamic-memory-allocation delete-operator

我正在编写一些我正在编写的代码问题;每当我删除我动态分配的数组时,程序崩溃并抛出一个错误“_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)]。当我从析构函数中删除delete命令时,程序编译并运行正常。但是,我担心内存泄漏的可能性;我想学习如何正确地动态分配对象和对象数组。我现在已经看了大约2个小时,但我仍然无法找到解决方案。

我假设对'new'的调用会动态地在堆上分配一定量的内存,并最终要求通过调用'delete'来释放内存。按理说,在类构造函数中分配的东西(或者,在本例中,在构造函数内部调用的类方法中)应该在类析构函数中释放。

我仍然是C ++和编程的新手,所以我可能会忽略一些非常简单的东西。如果我的代码中存在明显的错误,请告诉我这会导致此类错误。

0 个答案:

没有答案