2017-10-10 80 views
1

我有一個功能解析ZeroMQ多部分消息並填充含有一個結構一個gsl::span<uint8_t>GSL ::由函數返回跨度具有錯誤的字節

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特性的新手)?

+0

'gsl :: span '是一個**非**擁有的觀點。 – Jarod42

回答

2
auto body = msg.pop(); 

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

body是函數內部的局部變量。 span指的是body擁有的字節,但body在函數退出時被破壞,因此parsed.body中的span不再指向有效字節,當您嘗試在parseForwarderToClient之外使用它時。

+0

好的,謝謝,我解決了我的錯誤。但有沒有辦法使我的代碼按預期工作? –

+2

將其存儲在'std :: vector '內。 – Jarod42