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 !!
答案 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;
}