【问题标题】:Properly delete a pointer to a class from the vector从向量中正确删除指向类的指针
【发布时间】:2018-08-09 03:08:21
【问题描述】:

所有,

for( std::map<int, std::vector<Foo *> >::iterator it = fkFields.begin(); it != fkFields.end() && !found; it++ )
{
    for( std::vector<Foo *>::iterator it1 = it->second.begin(); it1 < it->second.end(); ++it1 )
    {
        if( refTableOrig == (*it1)->GetReferencedTableName() )
        {
            found = true;
            delete (*it1);
            (*it1) = NULL;
            it->second.erase( it1 );
        }
    }
    if( found )
        fkFields.erase( it );
}

当 std::vector 中只有 1 个元素时,上面的代码会崩溃,因为代码会尝试遍历 iterator::end()。

我也不能只使用vector.erase()/vector.remove(),因为向量包含指针,内存必须被删除。

那么从向量中删除指向元素的指针的正确方法是什么。

P.S.:这与所有其他问题不同,因为我的向量包含指针而不是对象。

TIA!!

【问题讨论】:

    标签: c++11 pointers vector erase


    【解决方案1】:

    首先,你应该检查it1 != it-&gt;second.end()

    其次,vector::erase的返回值是多少?

    一个迭代器,指向函数调用删除的最后一个元素之后的元素的新位置。

    所以你应该使用这些信息并重写你的内部 for 循环如下

    for( std::vector<Foo *>::iterator it1 = it->second.begin(); it1 != it->second.end();  )
     // [1] changed it1 != it->second.end()  [2] removed ++it1
    {
        if( refTableOrig == (*it1)->GetReferencedTableName() )
        {
            found = true;
            delete (*it1);
            (*it1) = NULL;
            it1 = it->second.erase( it1 );
        }
        else 
            ++it1;
    }
    

    【讨论】:

    • 谢谢 - 它有效。在擦除地图元素后,我还必须修复外循环以从中中断,但这超出了当前问题的范围。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多