Я заметил, что моя копия 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
CopyConstructible
? Т.е. Можете ли вы скопировать конструкцию, чтобы она освободила память, выделенную оригиналом? - person Howard Hinnant   schedule 31.08.2011