std::sort比较器内访问shared_ptr类型vector出现空值原因问询
问题根因说明
- 首先,在
std::sort的比较函数中直接访问正在被排序的容器,本身就违反C++标准规定,属于未定义行为。标准明确要求:传入std::sort的比较函数不得修改被排序序列的元素,也不得读取处于排序过程中的序列本身,因为排序过程中容器会持续执行元素移动、交换等操作,内部元素处于不稳定的中间状态。 - 空
shared_ptr的出现是移动语义的正常表现:std::sort的优化实现会优先调用元素的移动构造/移动赋值函数完成元素位置调整,shared_ptr的移动操作会将原实例的堆内存所有权转移给新实例,同时将原实例主动置为nullptr。 - 普通指针场景没有复现问题的原因也很简单:裸指针的移动操作本质就是地址值拷贝,移动之后原指针的地址值不会被修改,自然不会出现空指针的现象。
修复建议
如果你的比较逻辑确实需要依赖容器内的其他元素,请在调用std::sort前,将需要用到的所有数据拷贝到一份独立于原容器的只读结构中,比较时只访问这份拷贝的数据,绝对不要在比较函数内读写正在被排序的原容器。如果只是需要对比两个元素的属性,你的比较逻辑只需要用到传入的l、r两个参数即可,完全不需要遍历原容器。
内容的提问来源于stack exchange,提问作者Ritwik Jain
相关产品推荐
相关产品推荐

