int main(int argc, char **argv) { int v; Cell *cell, *top, *iter; top = cell = iter = alloc8.alloc(); v = top->car = 12; while ( cell = alloc8.alloc()) { iter->cdr = cell; cell->car = ++v; iter = cell; } iter = top; while ( iter ) { printf("iter 0x%x: %d\n", iter, iter->car); if ( iter->car == (12 + 3)) { printf("gc\n"); gc(); } if ( iter->car < 0 ) { iter = iter->cdr->cdr; } else { iter = iter->cdr; } } }
このソースで言えば
if ( iter->car < 0 ) { iter = iter->cdr->cdr; } else { iter = iter->cdr; }
が重要。iter->car < 0 となっているが car < 0 は意味がなくて moved したかどうかのチェック。これをスマートポインタの中に入れてしまえば iter = iter->cdr となってほんとうにスマート(いやスリムか?)に見える。