看看如下代碼,覺得輸出會是什么?
1 #include "stdafx.h" 2 #include <windows.h> 3 #include <iostream> 4 using namespace std; 5 6 DWORD WINAPI Func(LPVOID p); 7 typedef struct 8 { 9 int firstArgu; 10 long secArgu; 11 12 }MyType; 13 14 15 16 void test() 17 { 18 MyType MyTypeArgu={0}; 19 MyTypeArgu.firstArgu=1; 20 MyTypeArgu.secArgu=1; 21 CreateThread(NULL,0,Func,&MyTypeArgu,0,NULL);
//Sleep(1000); 22 } 23 24 void main() 25 { 26 test(); 27 system("pause"); 28 } 29 DWORD WINAPI Func(LPVOID p) 30 { 31 MyType* param=(MyType*)p; 32 int intValue=param->firstArgu; 33 long longValue=param->secArgu; 34 cout <<"firstArgu="<<intValue<<endl<<"secArgu="<<longValue<<"."<<endl; 35 cout<<"請等待……"<<endl<<endl; 36 return 0; 37 }
最終的輸出結果其實並不確定。
並不是輸出
firstArgu=1
secArgu=1
關鍵是CreateThread創建線程之后,將指針傳遞給線程方法后,test方法就退出了,就會將MyType的內存釋放了,導致線程再接受到指針后,訪問內存,卻不是原來的數據了。
如果想要輸出正確的結果,只需將//Sleep(1000)注釋取消,等待線程方法訪問之后,再退出就可以了。