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

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

本文关键字:什么 何时清 msgpack-c 使用      更新时间:2023-10-16

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

采取以下措施:

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

什么时候可以安全地删除msgdataunpack()之后 ?转换为T后?

什么时候可以安全地删除msgunpackedget()之后?

我需要deletefree参数吗?我需要明确地销毁像msgpack::type::raw_ref这样的成员吗?

什么时候删除 msgdata 是安全的?解包()后?转换为T后?

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

查看内存管理

您可以自定义复制的行为。当您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并不直接指msgdatamsgpack::objectmsgpack::unpacked持有的指msgdata

什么时候可以安全地删除 msgunpacked?在 get() 之后?

请参阅访问解压缩的数据

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_refmsgpack::object

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

请参阅转换、适配器、variant_ref

我需要删除或释放参数吗?

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

我是否需要显式销毁像 msgpack::type::raw_ref 这样的成员?

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