1

静的配列を使用して、バイナリ ヒープに基づいてプライオリティ キューを実装しようとしています (後でリンク リストを使用します。最初に配列でテストしたかっただけです)。

typedef struct n
{
    int x;
    int y;
    int size;
    double value;
} node;

node arr[100];
int total = 1;

void insertElement(int x, int y, int size, double value)
{
    node n;
    n.x     = x;
    n.y     = y;
    n.size  = size;
    n.value = value;

    arr[total] = n;

    if (total > 1)
        insertArrange(total);

    total += 1;
}

削除関数では、一番上のノードを返して削除し、ヒープ全体を再配置します。問題は、メモリを解放できないことです。私が使用するとします

free(&arr[1]);

解放されているポインターが割り当てられていないというエラーが発生しています。これは適切な実装方法ですか?メモリの問題に対処するには?

Apple LLVM 4.2 コンパイラで Xcode を使用しています。この全体は、最終的には Objective-C のより大きなプロジェクトに組み込まれますが、現時点では NSMutableArray を使用したくありません。Cで簡単なソリューションが必要です。

4

2 に答える 2

5

malloc() または calloc() を使用した場合にのみ free() を呼び出す必要があります。実際、それ以外のものを解放しようとすることは未定義の動作です。

現状では、コードがメモリをリークすることはありません。

于 2013-08-19T10:40:45.017 に答える
1

なぜ削除するのですか?必要なときはいつでも、ゼロにして新しいデータを書き込むことができます。また、削除したノードを覚えておくことをお勧めします。これにより、後で新しいノードを挿入する必要が生じたときに、空き領域がどこにあるかを事前に知ることができます。

例えば:

node arr[10];
indexes free_index[10];
//(delete the 6th member of nodes)
delete arr[5];
//remember which one you deleted
free_index[0] = 5;
//later when you add new node you can search the index and pick the first matching value
// zero it out so that it will not be used accidentally again like this
int i = free_index[0] // finding which one is free is task for loops
new_node(arr[i]);
free_index[i] = NULL;

このコード例は非常に不完全です。独自の実装に応じて完成させる必要があります。私はちょうどあなたにアイデアを与えました。free_index [0] = 0; に注意してください。基本的に、有効なインデックスとして一致することはありません。= NULL ステートメントでインデックスをゼロにする場合。

この配列のサイズを縮小したり、拡大したりしたくないという私の側からの大きな仮定もあります。いくつかの要素を空にしてから、新しい要素を追加してください。

配列を拡張したい場合は、まずそれをcallocする必要があります。構造体の配列を割り当てることができるので、 calloc をお勧めします。

これを増やすのはreallocで簡単です。

ただし、縮小すると、すべてのアクティブな結果を格納するノードの一時的な配列を作成し、元の配列を縮小し、一時的な配列からのアクティブな結果を元の解放された一時的な配列に戻す必要があります。

calloc(numberofnodearrays,sizeof(node));
于 2013-08-19T13:40:33.443 に答える