【问题标题】:Does Boost.Serialization Free the Memory Created during Loading Pointers?Boost.Serialization 是否释放在加载指针期间创建的内存?
【发布时间】:2014-05-13 02:43:28
【问题描述】:

具体来说,我指的是Boost.Serialization教程here中的demo。

在上面的演示中,bus_top 实例作为指针存储在bus_route 中,以展示如何实现指针的序列化。然而,我观察到一个有趣的行为,即析构函数bus_stop::~bus_stop() 从未被restore_schedule() 创建的bus_stop 对象调用。我在bus_stop::~bus_stop() 中设置了一个断点,它仅由main 函数末尾的delete 语句触发。

在加载序列化数据期间,用于初始化指针的对象在boost/archive/detail/iserializer.hpp 中定义的pointer_iserializer 中分配,它使用heap_allocator 来分配空间。

他们确实有一个destroy 函数来释放boost/serialization/access.hpp 中分配的内存,但似乎从未被调用过。

Boost.Serialization 不管理加载数据期间创建的指针是否正确?

【问题讨论】:

  • 你希望在哪里调用析构函数?
  • @n.m.当对象被释放时。实际上,我并不期望指针会在某个地方被释放。我只是感到奇怪,演示只是将其省略,并且在其文档中没有解释。还有人认为指针会自动释放here
  • 其他人大错特错。反序列化机制的任何部分都不拥有反序列化对象的任何部分。我不知道为什么这样的想法会出现在任何人的脑海中。 “多次加载同一个指针对象会导致只创建一个对象,从而复制原始指针配置”。这绝对没有说明任何东西被其他任何东西所拥有。在创作过程中记账,是的。创造后的所有权……这是什么幻想?
  • delete_created_pointers 的文档说:“删除由加载指针创建的所有对象。这可用于避免在加载指针并且存档加载遇到异常时可能发生的内存泄漏。 "是什么让任何人认为它在成功序列化后的任何时候都会自动调用?
  • 此外,反序列化的从属对象的自动删除必须使用魔法,因为存档根本不知道何时需要或安全地执行此类删除。

标签: c++ boost-serialization


【解决方案1】:

结论:

  • 指针在加载过程中存储,它们指向的对象由new创建(即boost::archive::detail::heap_allocatorboost::serialization::access::construct
  • 还有一个boost::serialization::access::destroy,但是AFAIK,它没有在boost 的任何地方被调用。
  • 用户有责任释放boost::serialization 分配的对象,使用delete(或boost::serialization::access::destroy,如果您愿意)。

【讨论】:

    猜你喜欢
    • 2011-11-15
    • 2013-06-30
    • 2012-12-28
    • 2011-09-27
    • 2020-06-23
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多