繁体   English   中英

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

[英]Vector iterators incompatible: runtime error

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

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

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

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

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

擦除不能按预期工作:它从容器中删除元素 ,即指针而不是指向的对象。 所以你在这里泄漏记忆。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM