如何实现分配器感知容器分配?

Dan*_*Dos 4 c++ memory-management allocator assign c++11

例如,来自std :: deque :: operator = in C++ Reference:
(1)Copy Assignment (const std :: deque&other)

用其他内容的副本替换内容.
如果std :: allocator_traits :: propagate_on_container_copy_assignment()为true,则目标分配器将替换为源分配器的副本.如果目标和源分配器不比较相等,则使用目标(*this)分配器来释放内存,然后在复制元素之前使用其他分配器来分配它.

如果this->get_allocator() == other.get_allocator(),我可以简单地破坏和释放this,如果需要'元素,或分配,如果需要构建元素,或复制分配的元素other*this如果需要的话.
但如果不是呢?上面的引用是否意味着我不能复制 - 分配元素,所以我必须首先销毁和释放所有元素,使用this->get_allocator(),然后分配和构造元素,使用other.get_allocator()
但如果是这种情况,我为什么要other.get_allocator()用于分配呢?
以后不会导致一些运行时错误,因为this不会正确释放内存吗?

(2)移动作业 (std :: deque && other)

使用移动语义替换其他内容(即其他数据从其他数据移动到此容器中).其他是后来处于有效但未指定的状态.如果std :: allocator_traits :: propagate_on_container_move_assignment()为true,则目标分配器将替换为源分配器的副本.如果它为假并且源和目标分配器不比较相等,则目标不能获取源存储器的所有权,并且必须单独移动 - 分配每个元素,根据需要使用其自己的分配器分配额外的存储器.在任何情况下,*this中最初存在的所有元素要么被销毁,要么被元素移动赋值替换.

如果this->get_allocator() == other.get_allocator(),这是一项简单的任务.
但如果没有,则上面会出现同样的问题,除非在这种情况下使用移动分配.

在这两种情况下,我还有一个问题.
如果元素既不能复制分配也不能移动分配,是否可以销毁它并从其他元素构建?如果是,我应该使用谁的分配器?

T.C*_*.C. 7

POCCA(传播容器拷贝分配)分配器被复制分配为容器的拷贝分配的一部分.同样,当分配容器的移动时,移动分配POCMA分配器.

上面的引用是否意味着我不能复制 - 分配元素,所以我必须首先销毁和释放所有元素,使用this->get_allocator(),然后分配和构造元素,使用other.get_allocator()

正确.

但如果是这种情况,我为什么要other.get_allocator用于分配呢?以后不会导致一些运行时错误,因为this->get_allocator()不会正确释放内存吗?

因为赋值传播分配器:赋值后,this->get_allocator()是一个副本other.get_allocator(),因此它可以安全地释放由它分配的内存.

如果this->get_allocator() == other.get_allocator(),这是一项简单的任务.但如果没有,则上面会出现同样的问题,除非在这种情况下使用移动分配.

实际上,这是完全不同的.使用POCMA分配器移动赋值是微不足道的:你破坏所有元素*this,释放内存,并掠夺内存和分配器other.

容器移动分配必须求助于逐元素移动分配/构造的唯一情况是当你有一个非POCMA分配器并且分配器比较不相等时.在这种情况下,所有分配和构造都完成,this->get_allocator()因为您不传播任何内容.

在这两种情况下,我还有一个问题.如果元素既不能复制分配也不能移动分配,是否可以销毁它并从其他元素构建?如果是,我应该使用谁的分配器?

使用最初构造的分配器来销毁它; 使用分配器构造它将被销毁.换句话说,如果要传播分配器,则使用目标分配器销毁它,并使用源分配器进行构造.