作者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/cn.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