関数の中のstatic変数

static変数は怖い。摩訶不思議。

const char* func(){
    static std::string s;
    s = GetHoge();
    return s.c_str();
}

const char* func(){
    static std::string s = GetHoge();
    return s.c_str();
}

にすると期待どうりに動かないだろう。

2/24 返り値の型まちがってたのを修正


なぜか?static変数の初期化は一度だけしか行われないからだ。
まあこれを書いた人の意図にもよるのではあるが、普通に考えると上記のfunc関数はGetHoge()で返されるstd::string型の文字列をstaticで取りconst char*型で返す型合わせの関数だと考えられる。本来こういう関数を書くべきではなく、マルチスレッドだとどうなるかわからない。けど致し方ないときもあるだろう。そしてこれを後者のように書いたなら、返す値は更新されず、いつかは無効なポインタを返すことになるだろう。