【发布时间】:2011-08-08 05:50:58
【问题描述】:
有人可以解释为什么下面的排序会导致段错误吗?这是 g++(指针排序向量)的已知错误吗?我正在使用 g++ 4.5.2 进行编译。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef vector<int> A;
bool face_cmp(const A *x, const A *y) {
return x != y;
}
int main(int argc, char* argv[]) {
vector<A *> vec;
for (int i=0; i<100; i++) {
vec.push_back( new vector<int>(i%100, i*i) );
}
vector<A *>::iterator it;
sort(vec.begin(), vec.end(), face_cmp);
return EXIT_SUCCESS;
}
在键盘上编译给出:
/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/debug/safe_iterator.h:240:
error: attempt to decrement a dereferenceable (start-of-sequence)
iterator.
Objects involved in the operation:
iterator "this" @ 0x0xbf4b0844 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPPN15__gnu_debug_def6vectorIiSaIiEEEN10__gnu_norm6vectorIS7_SaIS7_EEEEENS4_IS7_SB_EEEE (mutable iterator);
state = dereferenceable (start-of-sequence);
references sequence with type `N15__gnu_debug_def6vectorIPNS0_IiSaIiEEESaIS3_EEE' @ 0x0xbf4b0844
}
感谢您的所有快速回复。原来的 comp 函数是:
if (x == y) return false;
if (x->size() < y->size()) return true;
else if (x->size() > y->size()) return false;
else {
for (register int i=0; i<x->size(); i++) {
if ((*x)[i] < (*y)[i]) return true;
}
return false;
}
我只是更改了第一行并删除了其余部分。但事实证明,它也不是严格的弱排序(我忘记了如果 (*x)[i] > (*y)[i] 的情况)。我可能应该一开始就发布整个功能。不过,再次感谢!
【问题讨论】:
-
你的比较函数是假的。它不是比较值,而只是比较指针 - 充其量。
-
简化以使代码更短。它仍然会产生段错误。
-
你是在比较vector
的指针,必须在数据上比较 -
那么,实际的比较函数是什么?因为将其更改为合理的东西可以修复段错误。 ideone.com/qaaOA
-
指针向量排序没有问题;问题在于在比较函数中使用不等于而不是小于。
标签: c++ sorting segmentation-fault