Распределители C ++ 0x

Я заметил, что моя копия MSVC10 поставляется с контейнерами, которые позволяют использовать распределители на основе состояний, и написал простой распределитель пулов, который выделяет пулы для определенного типа. Однако я обнаружил, что если _ITERATOR_DEBUG_LEVEL != 0 вектор MSVC создает прокси-распределитель из переданного распределителя (для отслеживания итератора?), Использует прокси, а затем позволяет прокси выпадать из области видимости, ожидая, что выделенная память останется. Это вызывает проблемы, потому что мой распределитель пытается освободить пул после уничтожения. Разрешено ли это стандартом C ++ 0x?

Код примерно такой:

class _Container_proxy{};

template<class T, class _Alloc>
class vector {
     _Alloc _Alval;
public: 
    vector() {
        // construct _Alloc<_Container_proxy> _Alproxy
         typename _Alloc::template rebind<_Container_proxy>::other 
                 _Alproxy(_Alval);
        //allocate
        this->_Myproxy = _Alproxy.allocate(1);
        /*other stuff, but no deallocation*/
    } //_Alproxy goes out of scope

    ~_Vector_val() {    // destroy proxy
        // construct _Alloc<_Container_proxy> _Alproxy
        typename _Alloc::template rebind<_Container_proxy>::other
                 _Alproxy(_Alval);
        /*stuff, but no allocation*/
        _Alproxy.deallocate(this->_Myproxy, 1);
    } //_Alproxy goes out of scope again

person Mooing Duck    schedule 30.08.2011    source источник
comment
Ваш распределитель CopyConstructible? Т.е. Можете ли вы скопировать конструкцию, чтобы она освободила память, выделенную оригиналом?   -  person Howard Hinnant    schedule 31.08.2011
comment
Его можно переместить, но конструктор копирования такой же, как конструктор по умолчанию. Однако в этом случае мне понадобится origional, чтобы освободить память, выделенную копией, что намного сложнее. Хотя я об этом думаю.   -  person Mooing Duck    schedule 31.08.2011
comment
Возможно, поможет показать, как выглядит распределитель.   -  person Nicol Bolas    schedule 31.08.2011


Ответы (1)


Согласно гигантской таблице требований к распределителю в разделе 17.6.3.5, распределитель должен быть копируемым. Контейнерам разрешено свободно копировать их. Поэтому вам нужно сохранить пул в std::shared_ptr или в чем-то подобном, чтобы предотвратить удаление, пока существует один из распределителей.

person Nicol Bolas    schedule 30.08.2011
comment
Я уверен, что вы правы, но можете ли вы предоставить в стандарте раздел, в котором указывается это требование? - person Ben Voigt; 31.08.2011
comment
о, вот оно: X a1(a); Shall not exit via an exception. post: a1 == a и X a(b); Shall not exit via an exception. post: Y(a) == b, a == X(b) Хм. Тогда я все заново обдумаю. - person Mooing Duck; 31.08.2011
comment
Я упустил из виду требования к посту. - person Mooing Duck; 31.08.2011