c++ - 与 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 没有这样的提及
解决方案
推荐阅读
- javascript - 如何从数组localStorage中删除对象中的项目
- java - 计算最长连败的总损失
- javascript - Handlebars 点符号路径表达式返回空白值,但正常(非路径)表达式有效
- python - 通过 API (Python) 将多个视频添加到 youtube-playlist
- angular - Angular 如何在继续下一行之前等待方法完成
- c - 在C中返回字符串数组的函数
- android - 为什么 Double 从我的数据库返回错误的数据?
- python - 如何向我的 Django 自定义用户模型的密码添加安全要求?
- arduino - ESP32 同时使用 Async Web 服务器和 Now 协议?
- c++ - 链接目标文件时的 NVCC 多个定义