0

配列をそのように宣言する必要がある、私が書いたプログラムがあります

float (*array)[3] = new float[faces * 3][3];

これで、構文とすべてを理解できました。これは、固定サイズの配列へのポインターの配列です。私が理解していないのは、この背後にある基盤となる組織です。(ポインターの配列用の) メモリ割り当ては 1 つしかないため、固定サイズの配列用のメモリはどのように割り当てられますか?

同じスレッドに沿って、割り当てが 1 つしかないため、削除が 1 回あるはずです。つまり、配列はによって削除されます。

delete[] array;

しかし、ポインターが指すメモリーではなく、ポインターの配列のみが削除されたように見えるため、これがすべてのメモリーを取得する方法について混乱しています。

4

2 に答える 2

1

これは、固定サイズの配列へのポインターの配列ではありません。これは、多次元配列へのポインターです。多次元配列は 1 次元配列として実装され、要素へのアクセス時に何らかの計算が行われます。

メモリ レイアウトは、次のステートメントとまったく同じです。

float *array = new float[(faces * 3) * 3];

facesまたはこれで(定数式である必要があり、割り当てがスタック上にあることを除いて):

float arr3[faces*3][3];
float (*array)[3] = &arr3; // note the "&". it is not a decaying here

これは、このポインターのより一般的な形式です。

void something(float array[][3]); // this is not an array, but a pointer to one.

異なるサイズ/次元の配列は異なるタイプであり、1 次元配列に多次元配列としてアクセスする場合は、自分で計算する必要があることに注意してarray[3][2]ください。

于 2013-06-17T02:52:57.240 に答える
0

赤ちゃんのステップ。

まず、これらの固定長配列はfloat[3]特殊な型のように見えます。私はあなたがそれらで特定の操作を行うと推測しています。float[3]クラスに機能する関数と操作でa をラップする必要があります。Vector<float>内部で使用してサイズ 3のままにしておくこともできstd::vectorますが、追加および削除できるように設計されています。固定長の倍数用に設計された別の「標準テンプレート」クラスがあると思いますが、どれかわかりません。STLはあまり使いません。

自分の 's' を客観化したらfloat[3]、どのようにしても、より明確に見えるようになるにつれて、残りはより簡単になると思います.

于 2013-06-17T03:07:48.053 に答える