這個問題在這里已經有了答案: 可以在其范圍之外訪問區域變數的記憶體嗎? (20 個回答) 4天前關閉。
我傳遞一個USB_INSTACE_DATA變數的地址來CreateThread()像這樣運行。使用安全嗎,還是我必須對資料使用動態記憶體分配USB_INSTACE_DATA?
DWORD WINAPI MyThreadFunction(LPVOID lpParam);
void GetUSBInfo(PDEV_BROADCAST_DEVICEINTERFACE pDevInf, WPARAM wParam) {
USB_INSTACE_DATA data{ pDevInf, wParam };
DWORD dwThreadId;
auto hThreadArray = CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThreadFunction, // thread function name
&data, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier
}
uj5u.com熱心網友回復:
這不安全。USB_INSTACE_DATA data{ pDevInf, wParam };具有自動存盤期限。一旦封閉范圍結束(即函式回傳時),記憶體就會被清理。
CreateThread但是,通過 啟動的執行緒擁有一個&data超出函式范圍的指標。這是經典的 use-after-free 錯誤的一個實體。
解決方案是data至少與任何持有指向它的參考/指標的客戶端一樣長。您可以使用具有靜態存盤持續時間的記憶體或手動記憶體管理(例如堆分配)。請注意,這不會自動解決并發程式固有的任何其他問題,例如處理資料競爭。這是您必須單獨解決的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510146.html
標籤:C 视窗多线程温纳皮分配
下一篇:如何更改畫筆的顏色
