c ++无效指针从空闲列表中出队

c++ Invalid pointer dequeued from free list

我有一个 for 循环,我不断将一个向量的一部分复制到另一个向量并执行一些过程,直到它遍历原始过程,然后 运行 出现此错误:malloc: *** error for object 0x60c0000005e0: Invalid pointer dequeued from free list *** set a breakpoint in malloc_error_break to debug

我认为是提取子向量的方式所致:

vector<float> sub (order, 0);
for (vector<float>::iterator it = data.begin(); it < data.end() - order; it++) {

    std::copy(it, it + order, sub.begin());

    ...some other processing
}

我也试过每次都在 for 循环中创建一个新的向量对象,并将 std::copy() 替换为 for 循环,但仍然出现相同的错误:

for (int i = 0; i < order; i++) {
            sub[i] = *(it + i);
}

我只想要 Python 中的行为:sub = data[i: i + order]。正确的方法是什么?提前致谢。

整个函数

void MarkovChain::initTransitionMatrix(vector<float> data) {
    vector<float> sub (order, 0);
    for (vector<float>::iterator it = data.begin(); it < data.end() - order; it++) {
//        std::copy(it, it + order, sub.begin());
        for (int i = 0; i < order; i++) {
            sub[i] = *(it + i);
        }
        int key = statesToKey(sub);
        if (transitionMatrix.find(key) == transitionMatrix.end()) {
            transitionMatrix.insert(std::make_pair(key, vector<int> (numState, 0)));
        }
        int nextIndex = getIndexForState(*(it + order));
        transitionMatrix[key][nextIndex] += 1;
    }
}

此函数的目标是计算马尔可夫链的 t运行sition 矩阵。 order 在我的代码中指的是为了进行预测需要多少先前的样本,例如 data 的长度可能是 20 而 order 是 3。然后我尝试记录计数特定状态跟随长度为 order 的序列的次数,例如 'A' 状态跟随序列 'D' 'C' 'B' 的次数。所以我设置的循环终止条件是 it < data.end() - order 因为我想记录 data

的最后一个元素

这应该有效。

for (vector<float>::iterator it = data.begin(); it < data.end() - order; it++) 
{
    vector<float> sub (it, it+order);
}

我认为问题出在您的代码中的其他地方。在进入此函数之前 data 已经损坏,或者 statesToKey(sub) 损坏了 sub 向量。带有 std::copy 的原始代码很有魅力:https://www.onlinegdb.com/SycyVD5jf

另请注意,您使用 std::copy 的解决方案比 @Arkady 提出的解决方案更有效,因为它不涉及多次分配和释放内存。