2015-05-14 79 views
1

我试图使用STL优先级队列,定义为:当运行下面的代码C++ STL的优先级队列中获取bad_alloc的

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: *** error for object 0x230000000: pointer being freed was not allocated

+1

您能否提供一个编译并导致此错误的最小示例? – werewindle

+0

我不能,代码库相当长(除非你想克隆库) –

+0

看,错误可以在你的代码中的任何地方。它提供的代码片段几乎没有机会。在那里没有手动内存分配/释放,所以这段代码不应该导致双重释放错误。 – werewindle

回答

0

问题最终发生在代码的不同部分:复制矩阵时,要复制的行数有错误,这导致源矩阵的最后几行被复制到目标矩阵。因此,矢量没有正确初始化,并导致错误的分配错误。