从向量中正确删除指向类的指针
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从向量中正确删除指向类的指针相关的知识,希望对你有一定的参考价值。
所有,
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的返回值是多少?
一个迭代器,指向函数调用擦除的最后一个元素后面元素的新位置。
所以你应该使用这些信息并重写你的内部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;
}
以上是关于从向量中正确删除指向类的指针的主要内容,如果未能解决你的问题,请参考以下文章