簡體   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