>>222
 for(b = NULL; ; b = a) {

これは最初の判定で break; してしまった場合、
aが指すアドレスが不定になってしまう。
そのままで free() なんかするとメモリを壊してしまう。
メモリ破壊をしないためにあえてサンプルでは free() をしてなかったりして。

>>244
C++知らないけど、tryばっかりで深すぎて全体が流れとして見えなかった。
流れで見るのが間違ってるかもしれない。
小規模のしか作ったことないし。

>>246
while (1) {
if (a == NULL)

これは僕ならこう書く
while ( a ) {