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

C++ Runtime Error: free(): invalid next size (fast)

本文关键字:无效 快速 下一个 运行时错误 Free      更新时间:2023-10-16

我已经看到了有关此错误的mutliple帖子,但是我无法找到解决方案。在我的代码中,我有一个"基因"的向量,每个基因都以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环路结束时脱离范围的事实?

问题是否来自srcdst在For Loop的迭代结束时脱离范围的事实?

否,这些价值被推入矢量,在脱离范围之前,这很好。

c 运行时错误:free():无效的下一个大小(fast)

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

该内存错误不是来自std::vector,而是来自您的指针。在某个地方,您可以释放您不应该的东西?这可能是由您代表您的记忆分配不良引起的(您希望的是没有分配的东西)。谁知道您发布的代码。

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


ps:您真的需要使用这么多指针吗?我的意思是在您的功能中,您可以通过引用通过您的向量,例如:

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

然后做:

genome.at(i)->sourceNeuronID;

等等。

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