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

时间:2012-04-01 20:39:04

标签: c++ iterator

我目前在使用包含对象向量的类的析构函数时遇到问题。应用程序运行正常,但是在释放堆时会抛出错误。

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

    ~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++;
                }       
            }

网络由指向实际节点的指针组成。

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

erase无法正常工作:它会从容器中删除元素,即指针和指向的对象。所以你在这里泄漏记忆。

此外,擦除会使擦除元素后面的迭代器无效,因此当您将指针递增超过它时,测试iter != nodes.end();会导致错误。

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