【发布时间】:2018-07-05 10:22:32
【问题描述】:
好的,我通常默认假设错误在我的代码中,但我所看到的对我来说毫无意义。
我有一个std::vector<DocumentWidget *>,我想通过一些相对简单的算法对其进行排序。这就是我所看到的。
代码如下所示:
std::vector<DocumentWidget *> documents = DocumentWidget::allDocuments();
// NOTE(eteran): on my system, I have observed a **consistent** crash
// when documents.size() == 17 while using std::sort.
std::sort(documents.begin(), documents.end(), [](const DocumentWidget *a, const DocumentWidget *b) {
int rc = (a->filenameSet_ == b->filenameSet_) ? 0 : a->filenameSet_ && !b->filenameSet_ ? 1 : -1;
if (rc != 0) {
return rc < 0;
}
if(a->filename_ < b->filename_) {
return true;
}
return a->path_ < b->path_;
});
看起来很简单,但是当我在列表中有第 17 项时它会崩溃!排序谓词显然不会以任何方式修改vector,所以我看不出这是一个问题。到目前为止,地址清理程序和 valgrind 没有显示任何错误。
qSort 不会崩溃,似乎工作正常。没有其他正在运行的线程接触到这些数据,无论我走多慢,它都会可靠地发生......所以这不是竞争条件。
当我在调试器中查看时,a 参数似乎是“结束后”迭代器所指向的位置。但如果 std::sort 的行为是 ,则不应该发生这种情况。
注意std::vector 中有 17 项,我强制调试器显示第 18 项以说明 a 似乎来自哪里。
我无法想象std::sort 被窃听了,但我真的很难找到另一种解释。我在这里遗漏了一些明显的错误吗?!
【问题讨论】:
-
if(a->filename_ < b->filename_) { return true; }应该可能与相反。您可以同时使用a < b和b < a。 -
试试
return std::tie(a->filenameSet_, a->filename_, a->path_) < std::tie(b->filenameSet_, b->filename_, b->path_);
标签: c++ sorting c++11 vector segmentation-fault