1

(私はまだ自分の質問に答えるのに十分な評判がないので、最初にここに置きます。投稿したときはまっすぐに考えていませんでした。私にとっては午前3時でしたが、私には思い浮かびませんでした。他の場所で問題を探してください。

表示する独自のメッセージを持つオブジェクトをluaに動的に追加する別の関数を作成していました。そして、それが私に問題を与えるものなので、静的にロードすると問題ありません。これは確かにコードの別の部分の問題でした。)

私はここでかなり奇妙な問題を抱えています

私のC++コードはlua(ブーストライブラリなし)で動作しているので、luaから変数などを取得でき、luaは登録済みのC関数を呼び出すことができます。

これで、関数の2つのバージョンがあります。1つはANSI用で、もう1つはUnicode(中国語)用です。ANSIバージョンは正常に動作しているようで、壊れることはありません。問題はUnicodeバージョンにあります。

ユニコードをANSI形式で解読できたので、それで問題ありません。問題は、それが数回正常に動作することですが、同じluaコードを複数回繰り返すと、プログラムがクラッシュします。それがluaスタックの問題なのか、単にメモリの問題なのかはまだわかりません。

これが最初にコードを与えるコードです、これは私がそれを絞り込んだものです

int l_showMSG(lua_State *l)
{
    printf("showMSG::begin\n");

    SDL_SemWait(msgLock);
    char* fontname = (char*) lua_tostring(mainL,-1); lua_pop(mainL,1);
    wchar_t* txt = (wchar_t *) lua_tostring(mainL,-1);

    wstring msg = wstring(txt);  //this is the code that breaks

    lua_pop(mainL,1);
    SDL_SemPost(msgLock);
    printf("showMSG::done\n"); //it seens to get here or break in the line above depending on what I uncomment in my actual code o.o
    return 0;
}

したがって、printfとテストを何時間も行った後、wstring msg = wstring(txt)がそれを壊す行であることがわかりました。

少なくともここではクラッシュしないwidestringstreamを使用して回避しました(ただし、widestringstreamを使用するには、他の関数を修正する必要がありますが、おそらく)

しかし、wstring msg = buf.str()// bufがストリームであるような行を追加するとすぐに、同じ問題が発生します。

だから私は疑問に思っています、それが起こっている理由は何でしょうか?Code :: Blocksでデバッグモードをオンにすると正常に動作しますが、明らかにそれは良い解決策ではありません。私はWindowsを使用しているので、Valgrindも使用できません。

前もって感謝します

4

1 に答える 1

0

やっと見つけたので、これは別の問題が原因でした。私はluaを使用してオブジェクトを画面に動的に追加しています。これは別のリストに移動します。そのため、これらの別のリストの要素にアクセスすると、おそらくどこかで何かが上書きされ、後でテキストを表示しようとしたときにのみ問題が発生します.

ええ、常に他の可能性があります(笑)

午前 3 時に行う作業を信頼しないでください oo

于 2012-06-29T16:42:07.577 に答える