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