我看过有关此错误的多篇文章,但我找不到解决方案。在我的代码中,我有一个" Gene" s的向量,每个基因都包含一个int形式的源和目标。
我想创建一个int的向量,其中包含基因载体中源和目标的所有不同可能值。我首先浏览每个基因并确定源和目的地,然后检查该载体中是否已存在该ID。如果是,则忽略它,但如果是新值,则将其添加到向量中。
void addMutations(vector<Gene*>* genome){
vector<int> nodeIDs;
for(int i = 0; i < genome->size(); i++){
int src = genome->at(i)->sourceNeuronID;
int dst = genome->at(i)->destinationNeuronID;
if(find(nodeIDs.begin(), nodeIDs.end(), src) == nodeIDs.end()){
nodeIDs.push_back(src);// <-- Issue is here
}
if(find(nodeIDs.begin(), nodeIDs.end(), dst) == nodeIDs.end()){
nodeIDs.push_back(dst);// <-- Probably here too
}
}
问题是否来自src
和dst
在for
循环迭代结束时超出范围的事实?
答案 0 :(得分:1)
问题是否来自于
src
和dst
在for循环迭代结束时超出范围的事实?
不,在超出范围之前,这些值被推入向量中,所以这很好。
C ++运行时错误:free():下一个大小无效(快)
这意味着堆已损坏。在这种情况下,Valgrind会有所帮助。
内存错误不是来自std::vector
,而是来自你的指针。在某个地方,你释放了一些不应该的东西?这可能是由于您的内存分配不良造成的(某些内容尚未按您的意愿分配)。谁知道您发布的代码。
在任何情况下,你应该真正使用Valgrind跟踪该错误。
PS:你真的需要使用那么多指针吗?我的意思是在你的函数中,你可以通过引用传递你的向量,如下所示:void addMutations(vector<Gene*>& genome) {
然后执行:
genome.at(i)->sourceNeuronID;
等等。
指针很棒(例如在多态性中),但你应谨慎使用它们,当然,在需要时使用它们(Pan Metron Ariston)。