【问题标题】:Free all objects in boost::singleton_pool释放 boost::singleton_pool 中的所有对象
【发布时间】:2019-12-06 09:58:00
【问题描述】:

有没有办法一次性释放boost::singleton_pool 中的所有对象?

我发现我可以使用这些方法:

static void free(void *const);
static void ordered_free(void *const);
static void free(void *const, const size_type);
static void ordered_free(void *const, const size_type);

我想我可以使用它们通过手动迭代来释放所有对象。但是,有没有办法说“释放所有对象”,以便池再次完全释放?

基本上我想要purge_memory() 之类的东西,但这不会将内存释放回系统,而是将其分配在池中。

这样做的原因是我在池中构建了一个大对象(~2GB),我想很快摆脱它并开始构建一个新对象。调用purge_memory() 当前需要大约 2 秒,并且还会向系统释放内存(在诊断或任务管理器中,您可以看到进程内存在减少)。我希望通过简单地释放池中的东西而不实际解除分配,我可以很快炸毁第一个对象并开始构建下一个。

【问题讨论】:

    标签: c++ boost memory-management boost-pool


    【解决方案1】:

    假设您在 singleton_pool 中分配了 1000 个对象,总计 2 GB。如果有一个“free_all()”函数(没有),你将如何确保你仍然没有指向池中包含的数据的指针?您需要遍历所有此类指针以重置它们。当你这样做的时候,你不妨打电话给singleton_pool::free(ptr)

    基本上,您要求的 API 不存在,而且可能不应该存在。如果您想要最灵活(在我看来也是最有用的)API,请使用常规的 boost::pool,而不是经常阻碍优化的顶层。然而,它仍然没有“free_all()”函数,因为这又是一个错误农场。

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多