1

Cで汎用リンクリストを実装しています

struct Node
{
  void* data;
  struct Node* next;
};

ユーザーがどのデータが指すデータの割り当てと割り当て解除について心配するようにするのが良いですか、それとも自分で行う必要がありますか?ユーザーに任せた場合、スタックオブジェクトをリストに格納する可能性があり、後で問題が発生する可能性があります。どちらのデザインが良いか知りたかっただけです。

4

2 に答える 2

4

一般的な経験則、通常、次のとおりです。メモリを割り当てるのは誰か-メモリを解放する責任があります。

あなたの場合、ノード自体に注意を払う必要があり、ユーザーが責任を負う必要がありますdata

それは理にかなっています:

  1. ノードに責任を持つことで、後方互換性を心配することなく、将来のバージョンで実装を変更する自由が広がります。
  2. 解放する方法とかどうかわかりません。内部フィールドでdataも解放する必要がある複雑なタイプであるか、スタックに割り当てられたスペースを指している可能性があり、解放しようとするとエラーが発生します。
  3. さらに、ユーザーがリストから要素を削除した場合、それはデータを破棄したいという意味ではないことを覚えておいてください。たぶんリストはキューであり、要素は現在彼によって処理されていますか?
于 2012-08-22T09:43:57.137 に答える
0

関数ポインターとデータ型を使用して、汎用リンクリストの割り当てを解除する関数を作成することもできます。ユーザーは、関数にカスタマイズされたコードを指定し、その関数にポインターを渡して、コードのバージョンを実行し、複雑なデータ型で割り当てられたメモリを解放できます。たとえば、トラバースする必要のあるネストされた構造や、複数のポインター変数を持つ構造などです。同様に割り当てを解除します。以下は、このアイデアの抜粋です。main.c

int int_data;  /* int can be replaced by any other data type */
deallocate_data(user_defined_free, &int_data);

void user_defined_free(void *data)
{
    int *i = (int *)data;    
    /* cast to your data type and 
     perform deallocation */
}

ジェネリックリンクリストコードのどこか

void deallocate_data (void (*p)(void *), void *data)
{
  /* call user defined function to free their data structure */
    p(data);
}
于 2021-06-09T20:30:31.197 に答える