gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:37 24 4
gpt4 key购买 nike

我正在尝试对指向某个类的智能指针 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com