c ++ std :: set insert, вызывающий ошибку сегментации - PullRequest
2 голосов
/ 24 марта 2011

1001 * Все- *

Я не могу понять, почему этот фрагмент кода приводит к ошибке сегментации ... Любая помощь будет отличной.

#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

Ответы [ 2 ]

8 голосов
/ 24 марта 2011

Хорошо, посмотрите на свой код. Вы объявили функцию fncomp, но действительно ли вы ее где-нибудь используете? Вы инициализируете fn_pt с ним, но fn_pt нигде не используется. Тебе это не кажется странным? Как вы ожидаете, что ваш testSet объект узнает, что вы хотите, чтобы он использовал ваш fncomp в качестве компаратора, если вы никогда не просите ваш объект set использовать эту функцию?

Вы объявили свой набор testSet с обычным указателем на функцию типа bool(*)(A,A) в качестве типа компаратора. Это тип компаратора. Теперь вам нужно передать фактическое значение компаратора в ваш заданный объект через параметр конструктора

set<A, bool(*)(A,A)> testSet(fn_pt);

или

set<A, bool(*)(A,A)> testSet(fncomp);

(Вам не нужен этот промежуточный указатель fn_pt).

Вы забыли это сделать, и объект set использовал значение аргумента конструктора по умолчанию для компаратора, который в данном случае является нулевым указателем. Таким образом, каждый раз, когда ваш testSet объект пытается сравнить два элемента, он выполняет вызов функции через нулевой указатель. Не удивительно, что он падает.

1 голос
/ 24 марта 2011

Разве вы не получили предупреждение компилятора о неиспользуемой переменной fn_pt?

Переменная testSet имеет внутренний компаратор указанного типа bool(*)(A,A). Так как вы не инициализировали его, он был по умолчанию инициализирован как NULL. Поэтому, когда testSet попытался вставить A(1), он попытался вызвать нулевой указатель на функцию, чтобы определить, какой порядок правильный.

Вы, вероятно, имели в виду:

set<A, bool(*)(A,A)> testSet(fn_pt);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...