c ++ std :: set insert导致分段错误

poy*_*poy 2 c++ stl set

所有-

我无法弄清楚为什么这段代码会导致分段错误...任何帮助都会很棒.

#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)

AnT*_*AnT 8

好吧,看看你的代码.你声明了一个函数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对象尝试比较两个元素时,它都会通过空指针执行函数调用.难怪它崩溃了.