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!
}

そのため、2D ベクトルへのポインターが Shape (親クラス) で作成され、サブクラスのコンストラクターである Rectangle が動的に配列を割り当て、最初の要素のアドレスをそのポインターに格納します。

ただし、Rectangle のデストラクタでその配列を削除しようとすると、プログラムは実行時の既定の例外 [_BLOCK_TYPE_IS_VALID (phead-nblockuse)] をスローします。デストラクタから削除コマンドを削除すると、プログラムがコンパイルされ、正常に実行されます。ただし、メモリ リークの可能性が心配です。オブジェクトとオブジェクトの配列を正しく動的に割り当てる方法を学びたいと思います。これを約2時間調べましたが、まだ解決策を見つけることができません.

「new」を呼び出すと、ヒープに一定量のメモリが動的に割り当てられ、最終的には「delete」を呼び出すことでそのメモリを解放する必要があると想定しました。クラス コンストラクター内 (または、この場合、コンストラクター内で呼び出されるクラス メソッド内) に割り当てられたものは、クラス デストラクタ内で解放する必要があります。

私はまだC++とプログラミング全般に慣れていないので、見落としている非常に単純なものがあるかもしれません. 私のコードにこの種のエラーの原因となる明らかなエラーがある場合はお知らせください。

4

0 に答える 0