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

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

5 голосов
/ 31 августа 2011

Я заметил, что моя копия 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

1 Ответ

2 голосов
/ 31 августа 2011

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

...