全部-
我不太明白为什么这段代码会导致段错误...任何帮助都会很好。
#include <iostream>
#include <set>
using namespace std;
class A{
public:
int _x;
A(int x){
_x = x;
}
};
bool fncomp(A a1, A a2){
return a1._x < a2._x;
}
int main(){
bool(*fn_pt)(A,A) = fncomp;
set<A, bool(*)(A,A)> testSet;
for(int i=0; i<10; i++){
cout << i << endl;
A a(i);
testSet.insert(a);
}
}
输出是:
0
1
Segmentation Fault
最佳答案
好吧,看看你的代码。您声明了一个函数 fncomp
,但您真的在任何地方使用该函数吗?您用它初始化了 fn_pt
,但是 fn_pt
没有在任何地方使用。你不觉得奇怪吗?如果您从未要求您的 set 对象使用该函数,您如何期望您的 testSet
对象知道您希望它使用您的 fncomp
作为比较器?
您使用普通函数指针类型 bool(*)(A,A)
声明了您的集合 testSet
作为比较器类型。这是比较器的类型。现在,您必须通过构造函数参数将比较器的实际 值 传递给您的设置对象
set<A, bool(*)(A,A)> testSet(fn_pt);
或
set<A, bool(*)(A,A)> testSet(fncomp);
(你真的不需要那个中间指针 fn_pt
)。
您忘记这样做了,set 对象使用了比较器的默认构造函数参数值,在本例中为空指针。因此,每次您的 testSet
对象尝试比较两个元素时,它都会通过空指针执行函数调用。难怪它会崩溃。
关于c++ std::set插入导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5424990/