Cで汎用リンクリストを実装しています
struct Node
{
void* data;
struct Node* next;
};
ユーザーがどのデータが指すデータの割り当てと割り当て解除について心配するようにするのが良いですか、それとも自分で行う必要がありますか?ユーザーに任せた場合、スタックオブジェクトをリストに格納する可能性があり、後で問題が発生する可能性があります。どちらのデザインが良いか知りたかっただけです。
Cで汎用リンクリストを実装しています
struct Node
{
void* data;
struct Node* next;
};
ユーザーがどのデータが指すデータの割り当てと割り当て解除について心配するようにするのが良いですか、それとも自分で行う必要がありますか?ユーザーに任せた場合、スタックオブジェクトをリストに格納する可能性があり、後で問題が発生する可能性があります。どちらのデザインが良いか知りたかっただけです。
一般的な経験則は、通常、次のとおりです。メモリを割り当てるのは誰か-メモリを解放する責任があります。
あなたの場合、ノード自体に注意を払う必要があり、ユーザーが責任を負う必要がありますdata
。
それは理にかなっています:
data
も解放する必要がある複雑なタイプであるか、スタックに割り当てられたスペースを指している可能性があり、解放しようとするとエラーが発生します。関数ポインターとデータ型を使用して、汎用リンクリストの割り当てを解除する関数を作成することもできます。ユーザーは、関数にカスタマイズされたコードを指定し、その関数にポインターを渡して、コードのバージョンを実行し、複雑なデータ型で割り当てられたメモリを解放できます。たとえば、トラバースする必要のあるネストされた構造や、複数のポインター変数を持つ構造などです。同様に割り当てを解除します。以下は、このアイデアの抜粋です。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);
}