我有一个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
的最后一个元素
答案 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提出的解决方案更有效,因为它不涉及多次分配和取消分配内存。