0

このコードを使用して、スレッドで開始されたメッセージボックスの奇妙な動作があります:

DWORD WINAPI CreateMessageBox(LPVOID lpParam) {
    MessageBoxA(NULL, (char*)lpParam, "", MB_OK);
    return 0;
}
std::string msg = "Hello World";
CreateThread(NULL, 0, &CreateMessageBox, msg.c_str(), 0, NULL);

このコードは正常に動作しますが、次のようになります。

DWORD WINAPI CreateMessageBox(LPVOID lpParam) {
    MessageBoxA(NULL, (char*)lpParam, "", MB_OK);
    return 0;
}
CreateThread(NULL, 0, &CreateMessageBox, "Hello World", 0, NULL);

変数ではないのになぜ動いているのか理解できず、変数に変更すると空のメッセージボックスが表示されるのですが、「Hello World!.

4

1 に答える 1

0

msgはローカル変数 (スタックに割り当てられる) であり、そのコードを含む関数/メソッドが戻るとすぐに破棄されます。そのため、スレッドは を使用しているときに無効なメモリにアクセスしますlparam

解決策のいくつかは次のとおりです。

1.) declare 'msg' as static - probably not a good idea
2.) allocate 'msg' on heap, but then you will have to destroy it somewhere
3.) make 'msg' a member variable
于 2013-10-09T20:55:20.370 に答える