矢量迭代器不兼容:运行时错误

问题描述:

我目前遇到了包含对象矢量的类的析构函数问题。应用程序运行良好,但释放堆时会引发错误。矢量迭代器不兼容:运行时错误

这里是我的析构函数的代码:

~StaticNetwork(void) { // clear memory 
    for(vector<Node*>::iterator iter = nodes.begin(); iter != nodes.end();) 
     nodes.erase(iter++); 
} 

和节点被添加到网络中,如下所示:

if((temp = is_already_added(regex_d[1])) >= 0) // check if the src node has already been added 
      { 
       if((temp1 = is_already_added(regex_d[2])) >= 0) // check if the next_hop has already been added 
       { 
        nodes[temp]->add_n_vchannels(regex_d[5]); 
        nodes[temp]->add_next_hop(nodes[temp1]); 
       } 
       else // the next_hop has not been added 
       { 
        Node *anext_hop = new Node(regex_d[2]); 

        nodes[temp]->add_next_hop(anext_hop); 
        nodes[temp]->add_n_vchannels(regex_d[5]); 

        nodes.push_back(anext_hop); // add next hop   
        param.n_of_nodes++; 
       }  
      } 

该网络由指针实际节点。

任何帮助/建议/参考/(建设性)的批评将不胜感激。

您对容器的迭代是错误的。如果node是该类的成员,则忽略它,因为该向量的析构函数将处理它。如果它不是会员,并且确实想删除所有元素,最简单的方法是调用node.clear()(注意两者都等同于您的代码,但如果它应该由您的类管理,它们将泄漏指向内存)

如果指针由您的类管理,请考虑使用智能指针或特定的指针容器。否则最简单的循环来释放所有内存将是:

for (std::vector<Node*>::iterator it = nodes.begin(); it != nodes.end(); ++it) 
    delete *it; 

请注意,我没有修改容器本身,只是包含的元素。

+0

谢谢。那做了这个工作。 – Sebi 2012-04-01 20:51:46

+0

还应该指出,你得到的错误的原因是vector.erase使你的迭代器无效。 – 2012-04-01 21:07:08

+1

@Sebi:作为一个附注 - 如果你确实想要擦除依赖于迭代器的循环中的向量元素,可以使用iter = nodes.erase(iter)在'erase()'操作之后得到下一个有效的迭代器)'。要清楚 - 在这种情况下这没什么用处,但是在将来如果您发现自己想要执行'nodes.erase(iter ++)',请考虑使用'vector :: erase()'中的返回值。 – 2012-04-02 01:19:46

您不需要手动删除矢量元素,它将由矢量本身完成。这就是析构函数的工作方式:它们调用已删除对象的成员对象的析构函数,因此您不必担心它。

erase像您期望的不工作:撤销元素从容器,即指针和尖锐的物体。所以你在这里泄漏记忆。

此外,擦除操作将使删除的元素之后的迭代器无效,因此测试iter != nodes.end();会导致错误,因为您将指针递增。

无论如何,您可以编写代码,如DavidRodríguez - dribeas所示。