У меня странное поведение Messagebox, запущенного в Thread, используя этот код:
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);
Я не могу понять, почему он работает, когда он не является переменной, и если я изменю его на переменную, отображается Empty MessageBox, но я ожидал "Hello World !.
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
std::string msg
в качестве переменной-члена к этому классу.