使用 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
这样的成员吗?
什么时候删除 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
并不直接指msgdata
,msgpack::object
msgpack::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::object
。msgpack::type::raw_ref
、boost::string_ref
和msgpack::type::variant_ref
指msgpack::object
。
如果转换为这些类型,则需要保留msgpack::object
的生存期。
请参阅转换、适配器、variant_ref
我需要删除或释放参数吗?
不,T 位于堆栈上,您不需要释放它。如果 T 包含堆上的数据,如std::vector<sometype>
,数据应该由 T 的析构函数释放。
我是否需要显式销毁像 msgpack::type::raw_ref 这样的成员?
不,您不需要释放msgpack::type::raw_ref
。它只是一个引用类型对象。释放msgunpacked
时,msgpack::type::raw_ref
引用的内存将被释放。
- 使用信号检测子进程何时终止的最佳方法是什么?
- 什么是 libJvm.so,何时建造?
- 类型、value_type和element_type之间有什么区别,以及何时使用它们?
- 何时使用零字符以及它做什么
- 使用 msgpack-c 时需要清理什么以及何时清理?
- Dynamic_cast何时返回0,什么时候引发异常?CPP
- 什么是模板扣除指南,何时应该使用它们
- 什么是并行for循环,以及应该如何/何时使用它
- 在发出等待条件变量的信号后,线程何时获取锁?是什么决定了它
- 我搞不清我的代码出了什么问题
- 有什么方法可以判断分叉/执行Qt应用程序的主窗口何时显示?
- 通用 lambda 与标准模板函数(使用什么以及何时使用)
- 什么是'extern inline'函数以及何时使用?
- 什么是静态方法?如何以及何时使用它们
- 何时正确定义放置新放置,以及调用放置 new 时现有类型会发生什么情况
- 什么是std::d ecay以及何时应该使用它
- 什么是glm的vec1,vec2,vec3,我应该如何/何时使用它们?
- C++:在向量中插入什么 - 指针或引用,矢量何时复制它的元素?
- 什么是"is-implemented-in-terms-of"关系,何时应使用它?
- 什么决定临时变量的生存期何时扩展为常量引用或重值引用