我在MsgPack C headers中看到过对'zone'的引用,但是找不到它是什么或它是什么的文档。它是什么?此外,哪里有C API的功能文档?
答案 0 :(得分:4)
msgpack_zone
是用于内存管理的内部结构。拆包时的生命周期。我会说如果您使用unpacking或替代streaming版本的标准高级界面,则永远不会与之互动。
据我所知,没有详细的文档:相反,您应该参考提供方便代码示例的测试套件来实现常见任务,例如:请参阅pack_unpack_c.cc
和streaming_c.cc
。
答案 1 :(得分:0)
从我可以收集的内容来看,它是一种仅移动类型,用于存储msgpack::object
的实际数据。它很可能是一个实现细节,但它实际上泄露给用户'有时代码。例如,只要您想在lambda中捕获msgpack::object
,就必须捕获msgpack::zone
对象。有时您无法使用移动捕获(例如,在某些情况下,asio处理程序只会使用可复制的处理程序,或者您的编译器不支持该功能)。要解决此问题,您可以:
msgpack::unpacked r;
while (pac_.next(&r)) {
auto msg = result.get();
io_->post([this, msg, z = std::shared_ptr<msgpack::zone>(r.zone().release())]() {
// msg is valid here
}));
}