C++如何删除指向两个不同std :: lists中相同元素的指针?

1 c++ pointers runtime-error stdlist c++11

我是编程c ++的新手,所以如果我的源代码不是很精彩,请不要生我的气.

我必须编写一个程序来处理图形中的节点和边缘以供我学习.

std::lists我的源代码中有2个.第一个是存储常规Nodes,另一个是为了保存被调用的节点的类ArticleNodes.通常,所有元素都是指向创建对象的指针.

为了确定一个对象在另一个列表中是否相同,我保存了内存地址并将其与第二个列表中的元素进行比较.如果匹配,则将删除第二个元素.

现在我想删除两个列表中的一个元素:

void Graph::deleteNode(unsigned int nodeNumber)
{
    list<Node*>::iterator it = m_nodes.begin();
    ArticleNode* pCurrentArticleNode;
    for(unsigned int i=1; i<nodeNumber; i++) { it++; }

    Node* pCurrentNode = (*it);

    for (list<ArticleNode*>::iterator itArticle = m_articlenode.begin(); itArticle != m_articlenode.end(); itArticle++)
    {
        pCurrentArticleNode = (*itArticle);
        if(pCurrentNode==pCurrentArticleNode) { m_articlenode.remove(pCurrentArticleNode); }
    }

    m_nodes.remove(pCurrentNode);

    delete pCurrentNode;
    delete pCurrentArticleNode;
}
Run Code Online (Sandbox Code Playgroud)

我可以编译它,但是当我调用该函数时,我的程序只退出返回1.实际上,我发现if子句中的remove-command是问题所在.为什么这不起作用?

Sla*_*ica 5

您应该使用算法而不是手动执行所有操作:

void Graph::deleteNode(unsigned int nodeNumber)
{
    assert (nodeNumber < m_nodes.size());

    auto it = std::next( m_nodes.begin(), nodeNumber - 1 );

    auto itArticle = std::find( m_articlenode.begin(), m_articlenode.end(), *it );
    if( itArticle != m_articlenode.end() )
        m_articlenode.erase( itArticle );

    delete *it;
    m_nodes.erase(it);
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你的代码删除了两次相同的对象.