我正在编写一些我正在编写的代码问题;每当我删除我动态分配的数组时,程序崩溃并抛出一个错误“_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 ++和编程的新手,所以我可能会忽略一些非常简单的东西。如果我的代码中存在明显的错误,请告诉我这会导致此类错误。