プロが教える店舗&オフィスのセキュリティ対策術

ネット上のサンプルを見ると

lua_pushstring(L, "Hello world");

があります。

この"Hello world"の実体は、このスコープ内で何処かに存在することが保証されているだけで、スコープを抜けると直後に消えてしまうかもしれない、との記憶があります。

本来なら

lua_pushstring(L, strdup("Hello world"));

して、Lua側で渡されたポインタをfree()するべきだと思うのですが、そうしているサンプルがありません。

Luaを少し読むと、呼ばれた後で自前で複製しているようですが、その複製を行うまでにその内容が保存されているとことが前提となっているのでしょうか。

A 回答 (2件)

「スコープを抜ける」を勘違いしているように思います。



スコープに入る

いろんな処理(「他の関数を呼び出す」も含む)

スコープを抜ける: これ以降、「スコープ内だけで有効なもの」を使ったときの保証が無くなる

というのが基本的な流れです。

lua_pushstring(L, "Hello world");
は「いろんな処理」にあたり、スコープを抜けることになりません。

もしlua_pushstringでスコープを抜けて、文字列が無効になるなら、
printf("Hello world");
の printf でスコープを抜けて、"Hello world"が無効になるので、printfが出力できない、という理屈になります。


また
https://www.lua.org/pil/24.2.1.html
には「Lua never keeps pointers to external strings(以下略)」と明記されています。



これとは別に。
文字列リテラルの寿命からして、「スコープを抜けたら消える」というものではありません。
過去の質問にこんなのがありました。
https://oshiete.goo.ne.jp/qa/7879297.html
    • good
    • 0

C の話だとしたら, 「スコープを抜けると直後に消えてしまうかもしれない」という事実はありません.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!