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

时间:2018-04-10 16:01:49

标签: c++ memory-management c++-standard-library

我有一个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循环中创建一个新的向量对象,并用for循环替换std::copy()但仍然遇到同样的错误:

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;
    }
}

此函数的目标是计算马尔可夫链的转移矩阵。我的代码中的order指的是为了进行预测所需的先前样本数量,例如data可能长度为20且order为3.然后我尝试记录计数在长度为order的序列之后的特定状态,例如&#39; A&#39;国家遵循序列&#39; D&#39; &#39; C&#39; &#39; B&#39 ;.所以我设置的循环的终止条件是it < data.end() - order,因为我想记录data的最后一个元素

2 个答案:

答案 0 :(得分:1)

这应该有效。

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

答案 1 :(得分:1)

我认为问题出在代码中的其他地方。在输入此功能之前,data已经损坏,或者statesToKey(sub)会破坏sub向量。 std::copy的原始代码就像一个魅力:https://www.onlinegdb.com/SycyVD5jf

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