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

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;
}

以上是关于从向量中正确删除指向类的指针的主要内容,如果未能解决你的问题,请参考以下文章

我是否正确删除了指向对象的向量?

删除指针向量时遇到问题

C ++从向量中删除指针会导致堆错误

如何从指向对象的指针向量中删除对象? [复制]

当指针指向的对象被另一个类的实例删除时重新分配指针

C ++在向量迭代中删除并返回指向对象的指针