有人可以向我解释这里发生了什么吗? (我对C ++不够熟悉)。
我有一个std::string
,它以4 int32_t
开头,使用二进制字符串流并调用方法write()
。
当我这样做时,index
,type
和tag
(4个int32-ts中的3个)是正确的。
SocketInfo currentSocketInfo;
currentSocketInfo.header.reserve(_headerLength);
int iResult = recv(socket, ¤tSocketInfo.header[0], _headerLength, 0);
auto headerIntPtr = reinterpret_cast<const int32_t*>(currentSocketInfo.header.c_str());
int32_t index = headerIntPtr[1];
int32_t type = headerIntPtr[2];
int32_t tag = headerIntPtr[3];
appendCurrentMessageFromSocket(socket, currentSocketInfo);
但是,当我按值将currentSocketInfo
传递给函数时,则执行完全相同的reinterpret_cat和赋值,值不同。 (首先他们喜欢0,1,0,但是在函数调用之后他们就像这样--252142&lt; - 不是确切的数字,只是类似的。)
void SocketListener::appendCurrentMessageFromSocket(SOCKET socket, SocketInfo socketInfo) {
auto headerIntPtr = reinterpret_cast<const int32_t*>(socketInfo->header.c_str());
int32_t index = headerIntPtr[1];
int32_t type = headerIntPtr[2];
int32_t tag = headerIntPtr[3];
}
这里是SocketInfo
类,与问题相关的部分只是标题字段:
class SocketInfo {
public:
bool waitingForWholeMessage;
std::string header;
std::string body;
int32_t expectedLength;
};
答案 0 :(得分:0)
你没有显示recv
内部的内容,但我认为它与memcpy
类似char
currentSocketInfo.header
。
根据您的说明,index
,type
和tag
分别为0
,1
和0
,因此我可以假设执行currentSocketInfo.header
后{0,0,0,0, 1,0,0,0, 0,0,0,0}
包含recv
。
接下来的事情是,string
的复制构造只复制“字符串”,这是一个0
- 结束char*
,所以它只复制到{{1}遇到了。
现在,0
为currentSocketInfo.header
,{0,0,0,0, 1,0,0,0, 0,0,0,0}
中复制的SocketInfo socketInfo
类似于SocketListener::appendCurrentMessageFromSocket
,这是一个空字符串。
因此,当您执行{0}
时,auto headerIntPtr = reinterpret_cast<const int32_t*>(socketInfo->header.c_str());
指向无意义的内存地址。
以下代码应对您所发生的事情产生相同的效果:
(P.S。为了简单起见我只是将你的索引改为0,1和2)
headerIntPtr
我使用VS2012 Ultimate测试了以上代码