Очередь приоритетов C++ STL получает bad_alloc

Я пытаюсь использовать приоритетную очередь STL, определяемую как:

template <typename T>
using min_queue = std::priority_queue<T, std::vector<T>, std::greater<T>>;

При запуске следующего кода:

Label kNN(int k, const Matrix &trainingSet, const std::vector<Label> &trainingLabels, Matrix &evSet, int i1, const DistanceF &f) {
    Timer timer("kNN Timer");
    min_queue<std::pair<double, Label>> distances;

    for (int i = 0; i < trainingSet.rows(); ++i) {
        distances.push(std::pair<double, Label>(f(trainingSet, i, evSet, i1), trainingLabels[i]));
    }

    int i = 0;
    int labels[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    while (!distances.empty() && i < k) {
        labels[(int)distances.top().second]++;
        distances.pop();
        ++i;
    }

    int maximum = 0;

    for (int j = 0; j < 10; ++j) {
        if (labels[j] > maximum) {
            maximum = j;
        }
    }

    return (double)maximum;
}

Я получаю следующую ошибку:

malloc: *** ошибка для объекта 0x230000000: освобождаемый указатель не был выделен


person Misguided    schedule 14.05.2015    source источник
comment
Не могли бы вы предоставить минимальный пример, который компилируется и вызывает эту ошибку?   -  person werewindle    schedule 14.05.2015
comment
Я не могу, кодовая база довольно длинная (если только вы не захотите клонировать репозиторий!)   -  person Misguided    schedule 14.05.2015
comment
Послушайте, ошибка может быть где угодно в вашем коде. Маловероятно, что он находится в предоставленном вами фрагменте кода. Там нет ручного выделения/освобождения памяти, поэтому этот код не должен вызывать двойную ошибку освобождения.   -  person werewindle    schedule 14.05.2015
comment
Я вообще не пользуюсь ручным выделением памяти, код написан полностью на stl, так что особого смысла в том, что должен быть double free, нет. Кроме того, отладчик указывает непосредственно на приоритетную очередь.   -  person Misguided    schedule 14.05.2015
comment
Как насчет реализации класса Matrix, например? Можете ли вы предоставить полную обратную трассировку из gdb? Какой указатель передается на malloc() ?   -  person werewindle    schedule 14.05.2015
comment
Согласно gdb, ошибка исходит от деструктора приоритетной очереди. Он пытается освободить свое внутреннее векторное представление и ужасно терпит неудачу. Похоже, что вектор пытается освободить std::pair в своем деструкторе. Возможно, мне придется создать std::pairs как новый.   -  person Misguided    schedule 14.05.2015
comment
что такое Label тип? Это просто псевдоним для double или есть какая-то логика для копирования и/или перемещения?   -  person werewindle    schedule 14.05.2015
comment
Это псевдоним для двойного, действительно   -  person Misguided    schedule 14.05.2015


Ответы (1)


Проблема оказалась в другой части кода: при копировании матрицы произошла ошибка в количестве копируемых строк, из-за чего последние строки исходной матрицы не копировались в целевую матрицу. Следовательно, вектор не инициализировался должным образом и вызвал ошибку неправильного распределения.

person Misguided    schedule 15.05.2015