我在使用此代码的线程中启动了Messagebox的奇怪行为:
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);
我无法理解为什么它不是变量时工作,如果我将其更改为变量,则显示空MessageBox,但我期待“Hello World!。
答案 0 :(得分: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