我正在使用Msgpack-c。我不清楚的一件事是如何在使用此库时正确处理内存。快速入门示例在本地声明所有内容,并且我假设依赖于在应用程序结束时调用析构函数,但我不能依赖于它。
采取以下措施:
msgpack::unpacked msgunpacked;
msgpack::unpack(&msgunpacked, msgdata, msglength);
T params = msgunpacked.get().as<T>();
return params ;
何时可以安全删除msgdata
? unpack()
之后?转换为T
后?
何时可以安全删除msgunpacked
? get()
之后?
我是否需要delete
或free
参数?我是否需要明确销毁msgpack::type::raw_ref
之类的成员?
答案 0 :(得分:1)
何时删除msgdata是否安全?解包后()?转换为T?
之后
使用msgpack::unpack()
功能时,默认的解包行为为复制。因此,您可以在调用msgdata
后销毁msgpack::unpack()
。
您可以自定义复制的行为。当您将unpack_reference_func
处理程序传递给msgpack::unpack()
时,当处理程序返回 true 时,msgpack::unpacked
可能会引用msgdata
。您可以通过referenced
参数检查参考状态。如果reference
参数设置为 true ,则msgpack::unpacked
引用msgdata
。
void unpack(
object_handle& result,
const char* data,
std::size_t len,
bool& referenced, // actual status for reference
unpack_reference_func f = nullptr, // customize copy/reference behavior
void* user_data = nullptr,
unpack_limit const& limit = unpack_limit());
严格来说,msgpack::unpacked
并未直接引用msgdata
msgpack::object
msgpack::unpacked
所引用msgdata
。
何时删除msgunpacked是否安全? get()之后?
get()
是获取msgpack::object
的成员函数。 msgpack::object
位于msgpack::zone
,一种内存池。 msgpack::unpacked
包含std::unique_ptr<msgpack::zone>
。这意味着您需要在访问msgunpacked
获取的msgpack::object
期间保持get()
的有效期。如果您从msgpack::object
转换为T,并且T未引用msgpack::object
,并且您不再访问msgpack::object
,则可以销毁msgunpacked
。我说T不是指msgpack::object
。这取决于T的类型。大多数类型不涉及msgpack::object
。 msgpack::type::raw_ref
,boost::string_ref
和msgpack::type::variant_ref
引用msgpack::object
。
如果转换为这些类型,则需要保留msgpack::object
的生命周期。
请参阅conversion,adaptor,variant_ref
我是否需要删除或释放params?
没有。 T位于堆栈上,您无需释放它。如果T包含堆上的数据,如std::vector<sometype>
,那么数据应该由T的析构函数释放。
我是否需要明确销毁msgpack :: type :: raw_ref等成员?
不,您不需要免费msgpack::type::raw_ref
。它只是一个引用类型对象。 <{1}}被释放时释放msgpack::type::raw_ref
引用的内存。