复制构造函数改变了std :: string

时间:2015-02-05 05:18:40

标签: c++ string copy-constructor

有人可以向我解释这里发生了什么吗? (我对C ++不够熟悉)。

我有一个std::string,它以4 int32_t开头,使用二进制字符串流并调用方法write()

当我这样做时,indextypetag(4个int32-ts中的3个)是正确的。

SocketInfo currentSocketInfo;
currentSocketInfo.header.reserve(_headerLength);
int iResult = recv(socket, &currentSocketInfo.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;
};

1 个答案:

答案 0 :(得分:0)

你没有显示recv内部的内容,但我认为它与memcpy类似char currentSocketInfo.header

根据您的说明,indextypetag分别为010,因此我可以假设执行currentSocketInfo.header{0,0,0,0, 1,0,0,0, 0,0,0,0}包含recv

接下来的事情是,string的复制构造只复制“字符串”,这是一个0 - 结束char*,所以它只复制到{{1}遇到了。

现在,0currentSocketInfo.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测试了以上代码