作者popen (Penpineapple-applepen)
看板C_and_CPP
標題[問題] 請問CString這行為什麼會錯?
時間Sun Feb 19 18:44:40 2017
我有個結構如下:
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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1487501082.A.593.html
1F:推 Raymond0710: SI的記憶體位置不合法 沒有new出來 02/19 18:56
2F:→ Raymond0710: 不好意思 看錯 02/19 18:57
3F:→ firose: 因為 GlobalAlloc 沒有呼叫 ctor 當你複製的時候就會... 02/19 19:39
4F:→ popen: GlobalAlloc配個記憶體而已,和字串給值也有關啊QQ 02/19 20:43
5F:推 james732: 主要是CString自己的建構子沒呼叫,狀態會不明吧 02/19 21:37
6F:→ james732: 改用new的話大概就好了 02/19 21:38
7F:推 cutekid: 這樣 SOCKET 是不是也有可能會有問題??搞不好也是個class 02/20 13:46
8F:→ popen: SOCKET就沒問題,原始程式都沒有問題 02/20 14:54
9F:推 cutekid: 瞭解 ^_^ 02/20 14:57
10F:推 james732: SOCKET只是個單純的structure,就沒有呼叫建構子的問題 02/20 17:23
11F:→ popen: 請問一下用new為何可以? new就會呼叫class建構子啊 02/21 10:43
12F:→ popen: malloc好像也沒有呼叫建構子,剛google一下,比較懂了,thanks 02/21 10:46