可以使用boost :: pool来使用boost :: any或boost :: variant吗?

时间:2018-02-10 20:42:26

标签: c++ boost boost-variant boost-any

升压::任何

我尝试编译并运行以下代码来测试它:

#include <boost/any.hpp>
#include <boost/pool/object_pool.hpp>

int main()
{
  boost::object_pool<boost::any> pool;
  boost::any *i = pool.malloc();
  *i = 1;

  boost::any *j = pool.construct(2);

  pool.destroy(i);
  pool.destroy(j);
}

但它在boost :: any析构函数中得到了段错误。

升压::变体:

尝试编译并运行以下内容:

#include <boost/any.hpp>
#include <boost/pool/object_pool.hpp>
#include <boost/variant.hpp>

int main()
{
  typedef boost::variant<int, double> my_variant;

  boost::object_pool<my_variant> pool;
  my_variant *i = pool.malloc();
  *i = 1;

  my_variant *j = pool.construct(2);

  pool.destroy(i);
  pool.destroy(j);
}

我收到以下错误:

  

a.out:visitation_impl.hpp:207:typename Visitor :: result_type   boost :: detail :: variant :: visitation_impl(int,int,Visitor&amp;,VPCV,   mpl _ :: true_,NBF,W *,S *)[含W = mpl _ :: int_&lt; 20&gt ;; S =   提高::详细::变种:: visitation_impl_step,   boost :: mpl :: l_iter&gt ;;访客=   升压::详细::变体:: invoke_visitor

     
    

VPCV = void *; NBF = boost :: variant :: has_fallback_type_; typename Visitor :: result_type = bool;     mpl _ :: true_ = mpl _ :: bool_]:断言`false'失败。中止     (核心倾销)

  

这是预期的行为吗? boost :: pool是否仅适用于简单的C ++类型,如int,doble,float等?

1 个答案:

答案 0 :(得分:2)

是的,提升池适用于两者。你只是错误地使用它。

  

CAVEAT :根本没有用到boost::any的池分配器,因为它会动态地将保留值分配到池之外。

     

但这并不意味着如果你正确使用它就不能。

malloc仅分配未初始化的内存。希望能够分配,就好像它是该点所暗示的对象类型的完整功能实例一样,这是你的错误。

T *i = pool.malloc();
new (i) T();

这解决了它:

<强> Live On Coliru

#include <boost/pool/object_pool.hpp>
#include <boost/any.hpp>
#include <boost/variant.hpp>

template <typename T>
void run_test() {
    boost::object_pool<T> pool;

    T *i = pool.malloc();
    new (i) T();
    *i = 1;

    T *j = pool.construct(2);

    pool.destroy(i);
    pool.destroy(j);
}

int main() {
    run_test<boost::variant<int, double> >();
    run_test<boost::any>();
}

在asan / ubsan和valgrind下也可以运行。

奖金问题

  

这是预期的行为吗? boost :: pool是否只适用于简单的C ++类型,如int,doble,float等?

对于POD类型或普通类型,你可以通过删除构造函数来逃避,就像在这些情况下允许C ++编译器忽略它们一样。