K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[1879] Re:crowbar_book_ver4について
返信


投稿者:(ぱ)こと管理人
2013/11/24 23:19:43

Link:
>こんにちは、@rednaxelafxことKrisと申します。

中国からありがとうございます。
(中国語版がもう出版されているということを私も今知りました)

>このたびはcrowbarについてちょっと聞きたいことがあります。

>その中のcrowbar_book_0_4ですが、interface.cでのrelease_global_strings()が
>こうなっています:
>static void
>release_global_strings(CRB_Interpreter *interpreter) {
>    while (interpreter->variable) {
>        Variable *temp = interpreter->variable;
>        interpreter->variable = temp->next;
>    }
>}

確認しました。確かに無駄なことをしているように見えます。
そもそも関数名がrelease_global_stringsなのに、文字列に対して
何かしているように見えません。

どうしてこうなったのかと思い、調べたのですが、どうも
ver.0.1のこのコードが原因なのかと思います。

http://kmaebashi.com/programmer/devlang/crowbar_src_0_1_01/S/15.html#76
static void
release_global_strings(CRB_Interpreter *interpreter) {
    while (interpreter->variable) {
        Variable *temp = interpreter->variable;
        interpreter->variable = temp->next;
        if (temp->value.type == CRB_STRING_VALUE) {
            crb_release_string(temp->value.u.string_value);
        }
    }
}

ver.0.1時点では、参照カウンタのGCしかなかったので、インタプリタを
破棄するときには文字列の領域はfreeする必要がありました。その処理が
上記のコードです。

ver.0.2でGCを組み込んだので、interpreter->variableをNULLにしておけば、
文字列の領域もcrb_garbage_collect()の呼び出しで解放されます。
ただ、ver.0.2を作ったとき、ヘッダファイルを直してコンパイルエラーを取って、
という作業をしているときに、コンパイルエラーの原因のところだけ削って
関数そのものが不要であることに気付かなかったのではないかと思います。
すみませんでした。再確認のうえ、正誤表に載せる等対応します。

細かいところまでソースを読み込んでいただき、作者冥利に尽きます。
ありがとうございました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[ より新しい投稿] [ より古い投稿]