3

ポインター配列を操作する必要があるプログラムがあります。私の問題は、要素 i をポインタ p (p[i]) から削除する方法がわからないことです。以下に問題を詳しく説明します。

私は構造を持っています:

struct CuttingLine
    {
        NxU32 linePoints[150];
        NxU32 lineLength;
        NxVec3 normal;
    };

次に、ポインターを宣言します。

CuttingLine* cuttingLines; 

次のようにポインタを初期化します。

cuttingLines = (CuttingLine*)malloc(sizeof(CuttingLine) * 10);

次に、いくつかの要素を追加します (これはデモンストレーションのみを目的としており、私のプログラムでは行が作成され、値が与えられていることに注意してください):

for(int i=0;i<3;i++)
    cuttingLines[i] = line;

次に、ポインターをもう一度調べて、3 つの要素を削除しますが、ポインターを解放したくはありません (free(cuttingLines) を呼び出してポインターを削除できることは理解しています)。どうやってやるの?その中の要素を削除したいだけですが、最初に割り当てられたメモリの割り当てを解除したくありません。

4

2 に答える 2

1

私には、ポインターの配列を持ち、配列の要素を動的に割り当てたいようです。この場合、ポインターの値を NULL に設定する必要があります。これは、ポインターが何も指していないことを意味します。このような:

cuttingLines[i] = NULL;

これは、「配列にポインターがありますが、何も指していません」という意味です。

ただし、( を呼び出してfree(cuttingLines[i])) メモリを解放しないと、メモリ リークが発生するため、プログラムの後半でメモリを解放することを忘れないでください。mallocこのためには、各呼び出しが返すものを指す別のポインターが必要になります。

念のため: ポインターを解放することはできません (たとえばsizeof(CuttingLine*)、malloc を使用して割り当てるという意味を除きます)。メモリを解放できるため、呼び出すとfree(ptr)、ポインタが指すメモリが解放されます。cuttingLinesまた、ポインターの配列、つまりポインターのポインターのように扱うため、その型は である必要がCuttingLine**あり、次のように宣言して割り当てます。

CuttlingLine** cuttingLines;
cuttingLines = (CuttingLine**)malloc(sizeof(CuttingLine*) * 10);

また、そもそもポインターへのポインターを使用する必要がない C++ を作成している場合を除き、malloc (こちらを参照) の戻り値をキャストしないでください。


一方、CuttingLines の配列がcuttingLines必要な場合は、正しく割り当てるという意味で正しい軌道に乗っており、個々の CuttingLine で使用されているメモリを解放する必要はありません。lineLengthただし、この場合、たとえば0 に設定してその値を確認することにより、コードまたは要素自体のインデックスを追跡しない限り、配列内のどの要素が有効で、どの要素が有効でないかはわかりません。

于 2013-05-22T17:29:50.357 に答える