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

What and When needs to be cleaned up when using msgpack-c?

我正在使用 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 这样的成员?

When is it safe to delete msgdata? After unpack()? After the conversion to T?

当您使用msgpack::unpack()函数时,默认的解包行为是复制。所以你可以在调用 msgpack::unpack() 之后销毁 msgdata

memory management

您可以自定义 copy 的行为。当您将 unpack_reference_func 处理程序传递给 msgpack::unpack() 时,当处理程序 returns 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并不是直接指代msgdatamsgpack::unpacked持有的msgpack::object是指msgdata.

When is it safe to delete msgunpacked? After get()?

accessing unpacked data

get()是获取msgpack::object的成员函数。 msgpack::object 位于msgpack::zone,一种内存池。 msgpack::unpacked 包含 std::unique_ptr<msgpack::zone>。这意味着在访问 get() 获得的 msgpack::object 期间,您需要保持 msgunpacked 的生命周期。如果你从 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 的生命周期。

conversion , adaptor , variant_ref

Do I need to delete or free params?

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

And do I need to destroy members like msgpack::type::raw_ref explicitly?

不,您不需要释放 msgpack::type::raw_ref。它只是一个引用类型对象。 msgpack::type::raw_ref 引用的内存在 msgunpacked 被释放时被释放。