从向量中正确删除指向类的指针

时间:2018-03-01 05:19:40

标签: c++11 pointers vector erase

ALL,

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 !!

1 个答案:

答案 0 :(得分:1)

首先,您应该检查it1 != it->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;
}