1

これは以前に尋ねられたと確信していますが、検索用語は私の特定の状況ではうまくいきません。
基本的に、2D タイル エンジンを作成しています。全体的な効率とオーバーヘッドを少し削減するために、独自の単純なメモリ管理コンテナーを実装することにしました...

次のコードは、私がそうするために使用しているものです。

Tile.h:

//Tile class
class CTile
{
public:
    CTile();
    ~CTile();
    unsigned int row;
    unsigned int column;
};

//Container class
class CTileLayer
{
public:
    CTileLayer(unsigned int nRows, unsigned int nCols, float w, float h);
    ~CTileLayer();

protected:
    CTile** m_tiles;
    unsigned long count;

    void Allocate(unsigned int nRows, unsigned int nCols, float w, float h);
    void Free();
};

Tile.cpp:

#include "Tile.h"


CTile::CTile() : row(0), column(0)
{
}

CTile::~CTile()
{
}


CTileLayer::CTileLayer(unsigned int nRows, unsigned int nCols, float w, float h) : m_tiles(NULL)
{
    Allocate(nRows, nCols, w, h);
}

CTileLayer::~CTileLayer()
{
    if(m_tiles != NULL) Free();
}

void CTileLayer::Allocate(unsigned int nRows, unsigned int nCols, float w, float h)
{
    unsigned int column = 0, row = 0;

    if(m_tiles != NULL) Free();
    m_tiles = new CTile*[count = (nRows * nCols)];

    for( unsigned long l = 0; l < count; l++ ) {
        m_tiles[l] = new CTile[count];
        m_tiles[l]->column = column + 1;
        m_tiles[l]->row = row + 1;
        //
        //...
        //
        if(++column > nCols) {
            column = 0;
            row++;
        }
    }
}

void CTileLayer::Free()
{
    delete [] *m_tiles;
    delete [] m_tiles;
    m_tiles = NULL;
    count = 0;
}

では、各タイルがどのように割り当てられ、解放されるかを見ることで、メモリ リークが発生しないと言っても過言ではありませんか?

もしそうなら、各オブジェクトのデストラクタが確実に呼び出されるようにしながら、この配列を解放する最も適切な方法は何でしょうか? 配列をループして、代わりに各オブジェクトを手動で削除する必要がありますか?

4

2 に答える 2

2

new CTile[count]count 回、 ごとに 1 回呼び出しましm_tiles[l]た。

delete[]したがって、 ごとに count 回呼び出す必要がありますm_tiles[l]


countしかし、何が良いのかは明らかではありません。配列の 2 つのレイヤーにはnRowsとを使用する必要があります。nColumns現在、割り当て済みnRows * nRows * nColumns * nColumnsのインスタンスがありますが、これはおそらく多すぎます。CTile

代わりに試してください

m_tiles = new CTile*[nRows];
m_tiles[l] = new CTile[nColumns];
于 2013-04-15T02:55:01.380 に答える