使用 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()
之后?
我需要 delete
或 free
参数吗? 我是否需要明确销毁像 msgpack::type::raw_ref
这样的成员?
When is it safe to delete msgdata? After unpack()? After the conversion to T?
当您使用msgpack::unpack()
函数时,默认的解包行为是复制。所以你可以在调用 msgpack::unpack()
之后销毁 msgdata
。
您可以自定义 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
并不是直接指代msgdata
,msgpack::unpacked
持有的msgpack::object
是指msgdata
.
When is it safe to delete msgunpacked? After 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::object
。 msgpack::type::raw_ref
、boost::string_ref
和 msgpack::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
被释放时被释放。
我正在使用 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
这样的成员?
When is it safe to delete msgdata? After unpack()? After the conversion to T?
当您使用msgpack::unpack()
函数时,默认的解包行为是复制。所以你可以在调用 msgpack::unpack()
之后销毁 msgdata
。
您可以自定义 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
并不是直接指代msgdata
,msgpack::unpacked
持有的msgpack::object
是指msgdata
.
When is it safe to delete msgunpacked? After 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::object
。 msgpack::type::raw_ref
、boost::string_ref
和 msgpack::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
被释放时被释放。