c++ - 智能指针的排序 vector : mysterious crash

标签 c++ sorting smart-pointers

我正在尝试对指向某个类的智能指针 vector 进行排序。我使用结构作为 std::sort 的第三个参数与 operator() :

struct PhraseSmartPtrParseCreationComparer
{
    bool operator()(const std::shared_ptr<Phrase>& a, const std::shared_ptr<Phrase>& b)
    {
        if (a.get() == nullptr)
            return b.get() != nullptr;
        if (b.get() == nullptr)
            return a.get() != nullptr;
        return *a < *b;
    }
};

偶尔,我会遇到一个段错误,其中比较方法中的一个指针指向一个无效结构;总是一个。有趣的是,就在排序之前,所有对象都完好无损;我还尝试修改函数以删除引用位:const std::shared_ptr<Phrase> a ,它在其他地方崩溃了。

这个调用没什么特别的:

std::sort(_detectedPhrases.begin(), _detectedPhrases.end(), PhraseSmartPtrParseCreationComparer()); 

我是否遗漏了什么或者我应该去别处寻找?

最佳答案

我无法相信它的解决速度如此之快。这是解释 - 感谢您的指导和提示,@BoBTFish 和@Jabberwocky。

的确,原因是分拣机是双向的。结果不对称。也就是说,当交换相同的两个项目时,有时会产生相同的答案。不幸的是,由于业务逻辑,它实际上是有效的。它基本上是一棵树,其中一个比较组件是一个项目是否允许成为另一个项目的父项 - 并且理论上两者都可以成为另一个项目的父项的情况是有效的。所以我没有改变。我所做的(希望它不是不好的味道)是添加这个解决方法(不要介意 nullptr 检查,它们不相关):

struct PhraseSmartPtrParseCreationComparer
{
    bool operator()(const std::shared_ptr<Phrase>& a, const std::shared_ptr<Phrase>& b)
    {
       return *a < *b && !(*b < *a);    
    }
};

关于c++ - 智能指针的排序 vector : mysterious crash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51437032/

相关文章:

c++ - 在关闭应用程序期间正确关闭可能运行很长时间的线程

c++ - 将嵌套的 std::arrays 视为具有链式 .data() 的单个平面数组

c++ - 在 OS X 上的 Xcode 中使用 AES/GCM 时出现编译错误

sorting - 更改 FullCalendar 月 View 上的默认事件排序顺序

java - 优先队列排序

c++ - 关于 shared_ptr 的竞争条件示例

c++ - 如何存储智能指针以将字符串映射到类中的成员函数,以便它不会因类型不完整而失败?

c++ - Qt 中的 STL 迭代器

sorting - unix排序与混合数字和非数字不一致

c++ - 智能指针而不是指针