看板 C_and_CPP 關於我們 聯絡資訊
我有個結構如下: typedef struct _SOCKET_INFORMATION { CHAR Buffer[DATA_BUFSIZE]; WSABUF DataBuf; SOCKET Socket; DWORD BytesSEND; DWORD BytesRECV; CString m_id; } SOCKET_INFORMATION, *LPSOCKET_INFORMATION; 函式定義如下: BOOL CreateSocketInformation(SOCKET s, CString str); BOOL CreateSocketInformation(SOCKET s, CString str) { LPSOCKET_INFORMATION SI; if ((SI = (LPSOCKET_INFORMATION)GlobalAlloc(GPTR, sizeof(SOCKET_INFORMATION))) == NULL) { printf("GlobalAlloc() failed with error %d\n", GetLastError()); return FALSE; } else printf("GlobalAlloc() for SOCKET_INFORMATION is OK!\n"); // Prepare SocketInfo structure for use SI->Socket = s; SI->BytesSEND = 0; SI->BytesRECV = 0; SI->m_id = str; //這行會當掉!! SocketArray[TotalSockets] = SI; TotalSockets++; return(TRUE); } 問題如下: 為何我在執行緒裡執行下面這函式 if (CreateSocketInformation(AcceptSocket, str_id) == FALSE) { printf("CreateSocketInformation(AcceptSocket) failed!\n"); return 1; } 它會當在SI->m_id = str; 只不過是單純設個CString字串,不明白怎麼試都會當= = 我只是在結構裡多加個id成員,目的是檢查登入的客戶id是否有重複 下面是原始的範例,我是拿它修改的 http://www.cnblogs.com/zzyoucan/p/5153898.html -- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.229.46.157 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1487501082.A.593.html
Raymond0710: SI的記憶體位置不合法 沒有new出來 02/19 18:56
Raymond0710: 不好意思 看錯 02/19 18:57
firose: 因為 GlobalAlloc 沒有呼叫 ctor 當你複製的時候就會... 02/19 19:39
popen: GlobalAlloc配個記憶體而已,和字串給值也有關啊QQ 02/19 20:43
james732: 主要是CString自己的建構子沒呼叫,狀態會不明吧 02/19 21:37
james732: 改用new的話大概就好了 02/19 21:38
cutekid: 這樣 SOCKET 是不是也有可能會有問題??搞不好也是個class 02/20 13:46
popen: SOCKET就沒問題,原始程式都沒有問題 02/20 14:54
cutekid: 瞭解 ^_^ 02/20 14:57
james732: SOCKET只是個單純的structure,就沒有呼叫建構子的問題 02/20 17:23
popen: 請問一下用new為何可以? new就會呼叫class建構子啊 02/21 10:43
popen: malloc好像也沒有呼叫建構子,剛google一下,比較懂了,thanks 02/21 10:46