私はCプログラミング言語でプロジェクトの一部としてリストに取り組んできました。参考までに、エントリとリストの構造は非常に基本的なデータ構造であり、そのように定義されています
typedef struct entry entry_t;
typedef struct list list_t;
struct entry
{
void * data;
entry_t * next;
};
struct list
{
size_t size;
entry_t * head;
entry_t * tail;
};
headそれぞれ最初と最後のエントリをtail指します。ヘッダーなどのオーバーヘッドエントリはありませんが、リストにはすべてのデータエントリがあるため、リストにエントリが1つしかない場合は、同じエントリを指す必要がありますhead。tailその上、リスト内のすべてのエントリを削除するようなスニペットがあります
list_t list;
entry_t * current, * next;
for(
current=list->head,
next=current->next,
free(current);
current!=list->tail;
current=next,
next=current->next,
free(current)
);
current問題は、メモリアドレスとlist->tailpoint toの値の比較が、currentポインタが解放された後に評価されることです。同じメモリブロックcurrentをlist->tail指してcurrent解放されたとすると、評価の結果はどうなりますか?さらに重要なことに、結果は(それが何であれ)あなたの経験のすべての異なるコンパイラで決定論的ですか?私の場合、プログラムはMSVCでコンパイルされ、正しく実行されます。つまり、解放された後のメモリアドレスcurrentとlist->tailポイントの値は等しくなります。current