2013-10-09 78 views
0

我有消息框的一個奇怪的行爲開始在一個線程中使用此代碼: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

msg是一個局部變量ack),並且只要包含該代碼的函數/方法返回,它就會被銷燬。因此,該線程在使用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 
+0

你能提供一個例子嗎?我不明白你的意思。如果我將msg聲明爲靜態(是我認爲最簡單的),我會遇到Segmentation故障,所以我將它改回來,因爲您寫的不是一個好主意。你能否給我一個例子,說明你對其他兩件事的含義? – user2855954

+0

如果您使用靜態變量,則不應該發生訪問衝突。無論如何,關於第三個選項,你在某個類中有這個代碼,對吧?我的意思是你用'C++'標籤標記了你的問題。然後將'std :: string msg'作爲成員變量添加到該類。 – user1764961