从向量中正确删除指向 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;
}
全部,
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;
}