Boost logo

Boost :

Subject: [boost] [STL + allocators] Bug?
From: Phil Bouchard (philippeb8_at_[hidden])
Date: 2016-02-17 13:17:47


This is about STL containers and allocators. It looks like a mistake in
the STL containers but I don't think there is any possible workarounds
if the Boost library is based on it.

When I look at the code of GCC's std::list:

   template<typename _Tp, typename _Alloc>
     void
     _List_base<_Tp, _Alloc>::
     _M_clear()
     {
       typedef _List_node<_Tp> _Node;
       _Node* __cur = static_cast<_Node*>(_M_impl._M_node._M_next);
       while (__cur != &_M_impl._M_node)
        {
          _Node* __tmp = __cur;
          __cur = static_cast<_Node*>(__cur->_M_next);
#if __cplusplus >= 201103L
          _M_get_Node_allocator().destroy(__tmp);
#else
          _M_get_Tp_allocator().destroy(std::__addressof(__tmp->_M_data));
#endif
          _M_put_node(__tmp);
        }
     }

I think it should make use of the allocator's specific pointer as such:

   template<typename _Tp, typename _Alloc>
     void
     _List_base<_Tp, _Alloc>::
     _M_clear()
     {
       typedef _List_node<_Tp> _Node;
       typedef typename _Alloc::rebind<_Node>::other::pointer _NodePtr;

       _NodePtr __cur = static_cast<_NodePtr>(_M_impl._M_node._M_next);
       while (__cur != &_M_impl._M_node)
        {
          _NodePtr __tmp = __cur;
          __cur = static_cast<_NodePtr>(__cur->_M_next);
#if __cplusplus >= 201103L
          _M_get_Node_allocator().destroy(__tmp);
#else
          _M_get_Tp_allocator().destroy(std::__addressof(__tmp->_M_data));
#endif
          _M_put_node(__tmp);
        }
     }

Meanwhile I don't think there is any workaround possible for this for
use of an allocator with specific pointer in Boost?


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk