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

Properly delete a pointer to a class from the vector

全部,

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

首先,您应该检查 it1 != it->second.end()

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

An iterator pointing to the new location of the element that followed the last element erased by the function call.

因此您应该使用此信息并按如下方式重写内部 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;
}