所有-
我无法弄清楚为什么这段代码会导致分段错误...任何帮助都会很棒.
#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);
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0
1
Segmentation Fault
Run Code Online (Sandbox Code Playgroud)
好吧,看看你的代码.你声明了一个函数fncomp,但你真的在任何地方使用该函数吗?你fn_pt用它初始化,但fn_pt没有在任何地方使用.你觉得这不奇怪吗?如果你从不要求你的set对象使用那个函数testSet,你怎么期望你的对象知道你希望它fncomp用作比较器?
您testSet使用普通函数指针类型bool(*)(A,A)将您的集合声明为比较器类型.这是比较器的类型.现在,您必须通过构造函数参数将比较器的实际值传递给set对象
set<A, bool(*)(A,A)> testSet(fn_pt);
Run Code Online (Sandbox Code Playgroud)
要么
set<A, bool(*)(A,A)> testSet(fncomp);
Run Code Online (Sandbox Code Playgroud)
(你真的不需要那个中间指针fn_pt).
您忘了这样做,并且set对象使用比较器的默认构造函数参数值,在本例中是一个空指针.因此,每次testSet对象尝试比较两个元素时,它都会通过空指针执行函数调用.难怪它崩溃了.
| 归档时间: |
|
| 查看次数: |
3120 次 |
| 最近记录: |