1

グリッド形式で配置されているいくつかのオブジェクトを追跡するために、2D配列を操作しようとしています。2D配列のの各要素に。を含めたいと思いますObject*Object私が定義したクラスであること。ただし、これらを処理するのは簡単ではありません。

これは、2D配列をObjectポインターで埋めるための私の方法です。

int xDim; 
//how far to go in the x direction
//x's Dimension that is

Object *** test; //the highest level pointer used

test = new  Object ** [xDim];
//add horizontal array of Object **

for(int fillPos=0; fillPos < xDim; fillPos++){
    //point each Object ** to  a new Object * array 
    //add column arrays
    test[fillPos] = new Object*[zDim];
}

私の意図は、この配列のポインタを使用して、たとえばObjectの子クラスを指すことです。私の意図は、これらをこのように使用することです。ObjectchildObj

for (int xPos=0; xPos < xDim; xPos++){
    for(int zPos=0; zPos < zDim; zPos++){
        //pointing each Object * in the 2D array to
        //a new childObj
        test[xPos] [zPos] = new childObj;
    }
}

これは、メモリの面で本当に面倒なことになる可能性があることを私は理解しています。これがそのような状況に対処するための良い方法であるかどうかを私は尋ねています。おそらくもっと vector< <vector<Object*> >うまくいくようなものでしょうか?ベクターは、メモリリークを回避するために、削除を適切に管理しますか?あるいは、ベクトル自体を取り除く前に、ベクトルをループしdeleteてそれぞれを呼び出す必要があるのではないでしょうか。Object*

それで、私が持っているように配列またはベクトルを使用する必要がありますか?各方法に関連するいくつかの問題は何でしょうか?

4

1 に答える 1

0

を使用するには、 each 、 each 、最後に最も外側の をこの順序で削除Object ***する必要があります。私の意見では、これには不注意や間違いの余地がたくさんあります。Object PointerArray of Object PointersArray of Object**

for (int xPos=0; xPos < xDim; xPos++) {
    for (int zPos=0; zPos < zDim; zPos++) {
        delete test[xPos][yPos];  // delete the object ptr
    }
    delete[] test[xPos];          // delete each array of object ptr
}
delete[] test;                    // delete the array of array of object ptrs

ベクトルはローカルにスコープされているため、私はむしろベクトルアプローチを好みます。動的割り当てはかなりコストがかかる可能性があるため、可能であれば避ける必要があります。

したがって、ベクトル アプローチの場合は、オブジェクト ptrs のみを削除する必要があります。(経験則として、new を呼び出すたびに、対応する delete を呼び出す必要があります)。

vector<vector<Object*>> matrix;

... // some code here

for each (vector<Object*> vec in matrix)
    for each (Object* oPtr in vec)
        delete oPtr;

コンパイル時に 2 次元配列のサイズがわかっている場合は、2 次元配列のメモリ管理を回避し、オブジェクト ポインターを管理するだけで同じ効果を得ることができます。

Object * matrix[xDim][yDim];  // xDim and yDim are compile-time constants

しかし、配列とは異なり、動的にサイズを変更できるという追加の利点があるため、ベクトルが好きです。そのため、事前にサイズを知ることを心配する必要はありません。

于 2013-01-16T21:54:56.987 に答える