C ++运行时错误:free():下一个大小无效(快)

时间:2017-12-06 07:01:50

标签: c++ pointers vector memory-management runtime-error

我看过有关此错误的多篇文章,但我找不到解决方案。在我的代码中,我有一个" 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
        } 
}

问题是否来自srcdstfor循环迭代结束时超出范围的事实?

1 个答案:

答案 0 :(得分:1)

  

问题是否来自于srcdst在for循环迭代结束时超出范围的事实?

不,在超出范围之前,这些值被推入向量中,所以这很好。

  

C ++运行时错误:free():下一个大小无效(快)

这意味着堆已损坏。在这种情况下,Valgrind会有所帮助。

内存错误不是来自std::vector,而是来自你的指针。在某个地方,你释放了一些不应该的东西?这可能是由于您的内存分配不良造成的(某些内容尚未按您的意愿分配)。谁知道您发布的代码。

在任何情况下,你应该真正使用Valgrind跟踪该错误

PS:你真的需要使用那么多指针吗?我的意思是在你的函数中,你可以通过引用传递你的向量,如下所示:

void addMutations(vector<Gene*>& genome) {

然后执行:

genome.at(i)->sourceNeuronID;

等等。

指针很棒(例如在多态性中),但你应谨慎使用它们,当然,在需要时使用它们(Pan Metron Ariston)。