智能指针的排序向量:神秘崩溃
Sorting vector of smart pointers: mysterious crash
我正在尝试对指向 class 的智能指针向量进行排序。我使用结构作为 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);
}
};
我正在尝试对指向 class 的智能指针向量进行排序。我使用结构作为 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);
}
};