首页 > 解决方案 > 与 gcc stl 库一起使用时,带有声明的移动运算符的自定义分配器会导致段错误

问题描述

您好,当使用带有定义的移动运算符的自定义分配器时,我遇到了段错误(使用 gcc 但不是使用 Visual Studio)。

在查看了 stl 代码之后,似乎对于一些像 deque 这样的容器,stl 在数据树销毁之前移动了分配器,并将可移动输入保留为“已分配状态”,从而导致了段错误。

_Deque_base(_Deque_base&& __x, true_type)
      : _M_impl(std::move(__x._M_get_Tp_allocator()))
      {
    _M_initialize_map(0);
    if (__x._M_impl._M_map)
      this->_M_impl._M_swap_data(__x._M_impl);
      }

问题是 _M_initialize_map(0) 上的数据初始化分配了一些对象(根节点),并且随着分配器的移动,在输入对象的销毁时,这个新创建的节点的释放(交换到旧对象中) , 是用无效的分配器制作的,因为它之前已被移动过。

所以我的问题是,这是 stl 实现的错误吗?或者分配器的移动操作符是否应该表现为复制操作符而不是“移动”操作符?

构造 a1 使其等于 a 的先验值。不抛出异常。a 的值不变,a1 == a。(C++20 起)

a 的值不变,a1 == a。(C++20 起)

正如@{Some程序员花花公子}的链接所指出的,从c ++ 20开始,移动运算符应该表现为右值上的复制运算符,而不是真正的移动运算符(为什么?)。

但是对于 c++<20 没有这样的提及

标签: c++c++11

解决方案


推荐阅读