智能指针的排序向量:神秘崩溃

Sorting vector of smart pointers: mysterious crash

我正在尝试对指向 class 的智能指针向量进行排序。我使用结构作为 std::sortoperator() 的第三个参数:

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);    
    }
};