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

C++ 智能指针的排序向量:神秘崩溃,c++,sorting,smart-pointers,C++,Sorting,Smart Pointers,我试图对指向类的智能指针向量进行排序。我使用struct作为第三个参数,使用operator()对std::sort进行排序: 有什么东西我遗漏了或者我应该去别处找吗 我简直不敢相信它解决得有多快。以下是解释-感谢您的指导和提示,@BoBTFish和@Jabberwocky 事实上,原因是分拣机是双向的。结果是不对称的。也就是说,当交换相同的两个项目时,有时可能会产生相同的答案。不幸的是,由于业务逻辑,它实际上是有效的。它基本上是一棵树,其中一个比较成分是一个项目是否被允许成为另一个项目的父项,

我试图对指向类的智能指针向量进行排序。我使用struct作为第三个参数,使用
operator()
std::sort
进行排序:


有什么东西我遗漏了或者我应该去别处找吗

我简直不敢相信它解决得有多快。以下是解释-感谢您的指导和提示,@BoBTFish和@Jabberwocky

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

struct phraseMartPtrParSecreationComparer
{
布尔运算符()(常数std::shared\u ptr&a,常数std::shared\u ptr&b)
{
返回*a<*b&!(*b<*a);
}
};

您的比较器似乎不符合a的要求,因为您
返回true用于有效指针之前或之后的
nullptr
。您需要选择一个-要将所有
nullptr
s排序到前面还是后面?如果这可能是您崩溃的原因,我不知道。@VadimBerman Undefined Behavior是一只奇怪的野兽-排序算法可能认为它已将某些内容排序到某个位置,而它没有排序,从而导致该插槽中出现垃圾。一次修复一个问题,然后缩小下一个问题的范围。值
0xfeeeee
表示您正在读取以前已释放的内存=>未定义的内存behaviour@BoBTFish是的,VisualStudio在调试版本中执行此操作@VadimBerman也许MinGW也做了同样的事情:如果没有反向检查,这是否会起作用?因为这似乎意味着您的
操作员,但我没有使用
操作员,但是分拣机将有足够的时间只
*a<*b
,而不使用
&&!(*b<*a)
。不,这就是问题所在。分拣机将为
操作员(a,b)
操作员(b,a)
返回(假设)true。现在它不正确了,所以你的
短语是
操作符
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;
    }
};
std::sort(_detectedPhrases.begin(), _detectedPhrases.end(), PhraseSmartPtrParseCreationComparer()); 
struct PhraseSmartPtrParseCreationComparer
{
    bool operator()(const std::shared_ptr<Phrase>& a, const std::shared_ptr<Phrase>& b)
    {
       return *a < *b && !(*b < *a);    
    }
};