使用msgpack-c时需要清理什么和何时?

时间:2016-12-30 11:49:50

标签: c++ memory-management msgpack

我正在使用Msgpack-c。我不清楚的一件事是如何在使用此库时正确处理内存。快速入门示例在本地声明所有内容,并且我假设依赖于在应用程序结束时调用析构函数,但我不能依赖于它。

采取以下措施:

    msgpack::unpacked msgunpacked;
    msgpack::unpack(&msgunpacked, msgdata, msglength);
    T params = msgunpacked.get().as<T>();
    return params ;

何时可以安全删除msgdata unpack()之后?转换为T后?

何时可以安全删除msgunpacked get()之后?

我是否需要deletefree参数?我是否需要明确销毁msgpack::type::raw_ref之类的成员?

1 个答案:

答案 0 :(得分:1)

  

何时删除msgdata是否安全?解包后()?转换为T?

之后

使用msgpack::unpack()功能时,默认的解包行为为复制。因此,您可以在调用msgdata后销毁msgpack::unpack()

请参阅memory management

您可以自定义复制的行为。当您将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()之后?

请参阅accessing unpacked data

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::objectmsgpack::type::raw_refboost::string_refmsgpack::type::variant_ref引用msgpack::object

如果转换为这些类型,则需要保留msgpack::object的生命周期。

请参阅conversionadaptorvariant_ref

  

我是否需要删除或释放params?

没有。 T位于堆栈上,您无需释放它。如果T包含堆上的数据,如std::vector<sometype>,那么数据应该由T的析构函数释放。

  

我是否需要明确销毁msgpack :: type :: raw_ref等成员?

不,您不需要免费msgpack::type::raw_ref。它只是一个引用类型对象。 <{1}}被释放时释放msgpack::type::raw_ref引用的内存。