Visual c++ C++;0x分配器

Visual c++ C++;0x分配器,visual-c++,scope,c++11,allocator,Visual C++,Scope,C++11,Allocator,我注意到,我的MSVC10副本附带的容器似乎允许基于状态的分配器,并编写了一个简单的池分配器,为特定类型分配池。 然而,我发现如果\u迭代器\u调试级别!=0MSVC向量从传递的分配器创建一个代理分配器(用于迭代器跟踪?),使用该代理,然后让该代理退出作用域,期望分配的内存保持不变。这会导致问题,因为我的分配器试图在销毁时释放它的池。这是C++0x标准允许的吗 代码大致如下: class _Container_proxy{}; template<class T, class _Alloc

我注意到,我的MSVC10副本附带的容器似乎允许基于状态的分配器,并编写了一个简单的池分配器,为特定类型分配池。 然而,我发现如果
\u迭代器\u调试级别!=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
class_容器_代理{};
模板
类向量{
_阿尔瓦尔;
公众:
向量(){
//构造Alloc Alproxy
typename\u Alloc::模板重新绑定::其他
_Alproxy(_Alval);
//分配
这个->\u Myproxy=\u Alproxy.allocate(1);
/*其他东西,但没有解除分配*/
}//\u阿普罗西超出范围
~\u Vector\u val(){//销毁代理
//构造Alloc Alproxy
typename\u Alloc::模板重新绑定::其他
_Alproxy(_Alval);
/*东西,但没有分配*/
_Alproxy.解除分配(本->我的代理,1);
}//\u阿普罗西再次超出范围

根据第17.6.3.5节中巨大的分配器要求表,分配器必须是可复制的。容器可以自由复制。因此,您需要将池存储在
std::shared\u ptr
或类似的东西中,以防止在存在一个分配器时删除。

是您的分配器
的合作伙伴吗Pyconstructable
?即,您是否可以复制构造它具有原始分配的复制释放内存?它是可移动构造的,但“复制构造函数”与默认构造函数相同。但是,在这种情况下,我需要原始区域来释放副本分配的内存,这要复杂得多。尽管我正在考虑。也许显示分配器的外观会有所帮助。我相信你是对的,但是你能提供标准中指定此要求的部分吗?哦,不是这里是:
xa1(a);不应通过异常退出。post:a1==a
xa(b);不应通过异常退出。post:Y(a)==b,a==X(b)
嗯。我会重新考虑事情。我忽略了post要求。