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



我正在尝试对指向类的智能指针向量进行排序。我使用结构作为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);    
}
};

最新更新