c++ - 函数返回的 gsl::span 有错误的字节

标签 c++ c++11 c++14 guideline-support-library

我有一个解析 ZeroMQ 多部分消息并填充包含 gsl::span<uint8_t> 的结构的函数:

struct ProtocolMessage{
    ProtocolMessage() {}
    ProtocolMessage(std::initializer_list<std::string> headers): 
        headers{headers} {}
    ProtocolMessage(std::initializer_list<std::string> headers, gsl::span<uint8_t> body): 
        headers{headers}, body{body} {}
    ~ProtocolMessage() = default;

    std::vector<std::string> headers;
    gsl::span<uint8_t> body;
};

ProtocolMessage ProtocolAsts1::parseForwarderToClient(zmq::multipart_t&& msg) const {
    ProtocolMessage parsed;
    parsed.headers.push_back(msg.popstr());
    auto body = msg.pop();

    parsed.body = gsl::span<uint8_t>{body.data<uint8_t>(), body.size()};

    std::cout << "parseForwarderToClient" << std::endl;
        for(size_t i = 0; i < parsed.body.size(); ++i)
    std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(parsed.body.data()[i]);
    std::cout << std::dec << std::endl;
    return parsed;
}

调用此方法的函数执行以下操作:

zmq::multipart_t msg{socketForwarder};
std::cout << msg.str();

auto parsed = parser->parseForwarderToClient(std::move(msg));

std::cout << "doLoop" << std::endl;
for(size_t i = 0; i < parsed.body.size(); ++i)
    std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(parsed.body.data()[i]);
std::cout << std::dec << std::endl;

问题是用 msg.str() 打印的字节数和里面parseForwarderToClient是一样的,而在调用函数中打印的是不同的(然后我的代码崩溃了)。

我在这段代码中做错了什么(我仍然是 C++11/14 和 gsl 功能的新手)?

最佳答案

auto body = msg.pop();

parsed.body = gsl::span<uint8_t>{body.data<uint8_t>(), body.size()};

body 是函数内部的局部变量。 span 指的是 body 拥有的字节,但是当函数退出时 body 被销毁,因此你的 span 在当您尝试在 parseForwarderToClient 之外使用它时,parsed.body 不再指向有效字节。

关于c++ - 函数返回的 gsl::span 有错误的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46663057/

相关文章:

c++ - 使用 dlib 对图像应用仿射变换

c++ - 运行我的 C++ 代码给我一个空白的控制台

c++ - 将 std::map 写入/读取到二进制文件需要运算符

c++ - 用于收集可调用对象的 std::function 的替代方法

c++ - 如何检查用户输入是否只包含字母?

带有箭头符号的 C++ 模板自动返回类型需要 decltype?

c++ - 如何使用模拟框架测试在谷歌测试延迟后进行的调用

c++ - Tensorflow C++ API 分配变量值

c++ - istream 提取的字符 >> double

c++ - 使用 memory_order_relaxed 进行存储,使用 memory_order_acquire 进行加载