私は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->tail
point toの値の比較が、current
ポインタが解放された後に評価されることです。同じメモリブロックcurrent
をlist->tail
指してcurrent
解放されたとすると、評価の結果はどうなりますか?さらに重要なことに、結果は(それが何であれ)あなたの経験のすべての異なるコンパイラで決定論的ですか?私の場合、プログラムはMSVCでコンパイルされ、正しく実行されます。つまり、解放された後のメモリアドレスcurrent
とlist->tail
ポイントの値は等しくなります。current