【发布时间】:2017-04-09 15:49:26
【问题描述】:
例如,来自 C++ 参考中的 std::deque::operator =:
(1) 复制赋值 (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)
将内容替换为其他内容 使用移动语义(即 other 中的数据从 other 移动到 这个容器)。 other 之后处于有效但未指定的状态。 如果 std::allocator_traits::propagate_on_container_move_assignment() 为真,目标分配器被源的副本替换 分配器。如果它是假的并且源和目标分配器做 不比较相等,目标不能获得源的所有权 内存并且必须单独移动分配每个元素,分配 根据需要使用自己的分配器来增加内存。无论如何,所有 最初出现在 *this 中的元素要么被破坏要么被替换 通过元素移动分配。
如果this->get_allocator() == other.get_allocator(),这很容易。
但如果不是,则与上述相同的问题,除了在这种情况下使用移动分配。
在这两种情况下,我还有一个问题。
如果元素既不能复制分配也不能移动分配,是否可以销毁它并从其他元素构造?如果是,我应该使用谁的分配器?
【问题讨论】:
标签: c++ c++11 memory-management assign allocator