Возвращенный функцией gsl :: span имеет неправильные байты

У меня есть функция парсинга составного сообщения 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 одинаковы, в то время как те, что печатаются при вызове funciton, отличаются (и мой код вылетает).

Что я делаю не так в этом коде (я все еще новичок в C ++ 11/14 и функциях gsl)?

1

Решение

auto body = msg.pop();

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

body является локальной переменной внутри функции. span ссылается на байты, принадлежащие body, но body уничтожается при выходе из функции, поэтому ваш span в parsed.body больше не указывает на действительные байты, когда вы пытаетесь использовать его за пределами parseForwarderToClient,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]